home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / MacPerl 5.0.3 / MacPerl Source ƒ / Perl5 / ext / POSIX / POSIX.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-04  |  88.9 KB  |  4,766 lines  |  [TEXT/MPS ]

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include <ctype.h>
  5. #ifdef I_DIRENT    /* XXX maybe better to just rely on perl.h? */
  6. #include <dirent.h>
  7. #endif
  8. #include <errno.h>
  9. #include <fcntl.h>
  10. #ifdef I_FLOAT
  11. #include <float.h>
  12. #endif
  13. #ifndef macintosh
  14. #include <grp.h>
  15. #endif
  16. #ifdef I_LIMITS
  17. #include <limits.h>
  18. #endif
  19. #include <locale.h>
  20. #include <math.h>
  21. #ifdef I_PWD
  22. #include <pwd.h>
  23. #endif
  24. #include <setjmp.h>
  25. #include <signal.h>
  26. #ifdef I_STDARG
  27. #include <stdarg.h>
  28. #endif
  29. #ifdef I_STDDEF
  30. #include <stddef.h>
  31. #endif
  32. /* XXX This comment is just to make I_TERMIO and I_SGTTY visible to 
  33.    metaconfig for future extension writers.  We don't use them in POSIX.
  34.    (This is really sneaky :-)  --AD
  35. */
  36. #if defined(I_TERMIOS)
  37. #include <termios.h>
  38. #endif
  39. #include <stdio.h>
  40. #ifdef I_STDLIB
  41. #include <stdlib.h>
  42. #endif
  43. #include <string.h>
  44. #include <sys/stat.h>
  45. #ifndef macintosh
  46. #include <sys/times.h>
  47. #endif
  48. #include <sys/types.h>
  49. #ifdef HAS_UNAME
  50. #include <sys/utsname.h>
  51. #endif
  52. #ifndef macintosh
  53. #include <sys/wait.h>
  54. #endif
  55. #include <time.h>
  56. #include <unistd.h>
  57. #ifdef I_UTIME
  58. #include <utime.h>
  59. #endif
  60.  
  61. typedef FILE * InputStream;
  62. typedef FILE * OutputStream;
  63. typedef int SysRet;
  64. typedef long SysRetLong;
  65. #ifdef macintosh
  66. #define sigset_t int
  67. #define sigaction(x) not_here("sigaction")
  68. #define sigpending(x) not_here("sigpending")
  69. #define sigprocmask(x) not_here("sigprocmask")
  70. #define sigsuspend(x) not_here("sigsuspend")
  71. #define sigemptyset(x) not_here("sigemptyset")
  72. #define sigaddset(x,y) not_here("sigaddset")
  73. #define sigdelset(x,y) not_here("sigdelset")
  74. #define sigfillset(x) not_here("sigfillset")
  75. #define sigismember(x,y) not_here("sigismember")
  76. #define pipe(x) not_here("pipe")
  77. #define setgid(x) not_here("setgid")
  78. #define setuid(x) not_here("setuid")
  79. #define mknod(x,y,z) not_here("mknod")
  80. #define tzset() not_here("tzset")
  81. #define ttyname(x) (not_here("ttyname"), (char *) 0)
  82. #define open(name,flags,mode) (open)(name,flags)
  83. #endif
  84. typedef sigset_t* POSIX__SigSet;
  85. typedef HV* POSIX__SigAction;
  86. #ifdef I_TERMIOS
  87. typedef struct termios* POSIX__Termios;
  88. #else /* Define termios types to int, and call not_here for the functions.*/
  89. #define POSIX__Termios int
  90. #define speed_t int
  91. #define tcflag_t int
  92. #define cc_t int
  93. #define cfgetispeed(x) not_here("cfgetispeed")
  94. #define cfgetospeed(x) not_here("cfgetospeed")
  95. #define tcdrain(x) not_here("tcdrain")
  96. #define tcflush(x,y) not_here("tcflush")
  97. #define tcsendbreak(x,y) not_here("tcsendbreak")
  98. #define cfsetispeed(x,y) not_here("cfsetispeed")
  99. #define cfsetospeed(x,y) not_here("cfsetospeed")
  100. #define ctermid(x) (char *) not_here("ctermid")
  101. #define tcflow(x,y) not_here("tcflow")
  102. #define tcgetattr(x,y) not_here("tcgetattr")
  103. #define tcsetattr(x,y,z) not_here("tcsetattr")
  104. #endif
  105.  
  106. /* Possibly needed prototypes */
  107. char *cuserid _((char *));
  108.  
  109. #ifndef HAS_CUSERID
  110. #define cuserid(a) (char *) not_here("cuserid")
  111. #endif
  112. #ifndef HAS_DIFFTIME
  113. #ifndef difftime
  114. #define difftime(a,b) not_here("difftime")
  115. #endif
  116. #endif
  117. #ifndef HAS_FPATHCONF
  118. #define fpathconf(f,n)     (SysRetLong) not_here("fpathconf")
  119. #endif
  120. #ifndef HAS_MKTIME
  121. #define mktime(a) not_here("mktime")
  122. #endif
  123. #ifndef HAS_NICE
  124. #define nice(a) not_here("nice")
  125. #endif
  126. #ifndef HAS_PATHCONF
  127. #define pathconf(f,n)     (SysRetLong) not_here("pathconf")
  128. #endif
  129. #ifndef HAS_SYSCONF
  130. #define sysconf(n)     (SysRetLong) not_here("sysconf")
  131. #endif
  132. #ifndef HAS_READLINK
  133. #define readlink(a,b,c) not_here("readlink")
  134. #endif
  135. #ifndef HAS_SETPGID
  136. #define setpgid(a,b) not_here("setpgid")
  137. #endif
  138. #ifndef HAS_SETSID
  139. #define setsid() not_here("setsid")
  140. #endif
  141. #ifndef HAS_STRCOLL
  142. #define strcoll(s1,s2) not_here("strcoll")
  143. #endif
  144. #ifndef HAS_STRXFRM
  145. #define strxfrm(s1,s2,n) not_here("strxfrm")
  146. #endif
  147. #ifndef HAS_TCGETPGRP
  148. #define tcgetpgrp(a) not_here("tcgetpgrp")
  149. #endif
  150. #ifndef HAS_TCSETPGRP
  151. #define tcsetpgrp(a,b) not_here("tcsetpgrp")
  152. #endif
  153. #ifndef HAS_TIMES
  154. #define times(a) not_here("times")
  155. #endif
  156. #ifndef HAS_UNAME
  157. #define uname(a) not_here("uname")
  158. #endif
  159. #ifndef HAS_WAITPID
  160. #define waitpid(a,b,c) not_here("waitpid")
  161. #endif
  162.  
  163. #ifndef HAS_FGETPOS
  164. #define fgetpos(a,b) not_here("fgetpos")
  165. #endif
  166. #ifndef HAS_FSETPOS
  167. #define fsetpos(a,b) not_here("fsetpos")
  168. #endif
  169.  
  170. #ifndef HAS_MBLEN
  171. #ifndef mblen
  172. #define mblen(a,b) not_here("mblen")
  173. #endif
  174. #endif
  175. #ifndef HAS_MBSTOWCS
  176. #define mbstowcs(s, pwcs, n) not_here("mbstowcs")
  177. #endif
  178. #ifndef HAS_MBTOWC
  179. #define mbtowc(pwc, s, n) not_here("mbtowc")
  180. #endif
  181. #ifndef HAS_WCSTOMBS
  182. #define wcstombs(s, pwcs, n) not_here("wcstombs")
  183. #endif
  184. #ifndef HAS_WCTOMB
  185. #define wctomb(s, wchar) not_here("wcstombs")
  186. #endif
  187. #if !defined(HAS_MBLEN) && !defined(HAS_MBSTOWCS) && !defined(HAS_MBTOWC) && !defined(HAS_WCSTOMBS) && !defined(HAS_WCTOMB)
  188. /* If we don't have these functions, then we wouldn't have gotten a typedef
  189.    for wchar_t, the wide character type.  Defining wchar_t allows the
  190.    functions referencing it to compile.  Its actual type is then meaningless,
  191.    since without the above functions, all sections using it end up calling
  192.    not_here() and croak.  --Kaveh Ghazi (ghazi@noc.rutgers.edu) 9/18/94. */
  193. #ifndef wchar_t
  194. #define wchar_t char
  195. #endif
  196. #endif
  197.  
  198. #ifndef HAS_LOCALECONV
  199. #define localeconv() not_here("localeconv")
  200. #endif
  201.  
  202. #ifdef HAS_TZNAME
  203. extern char *tzname[];
  204. #else
  205. char *tzname[] = { "" , "" };
  206. #endif
  207.  
  208. #ifndef HAS_LONG_DOUBLE /* XXX What to do about long doubles? */
  209. #ifdef LDBL_MAX
  210. #undef LDBL_MAX
  211. #endif
  212. #ifdef LDBL_MIN
  213. #undef LDBL_MIN
  214. #endif
  215. #ifdef LDBL_EPSILON
  216. #undef LDBL_EPSILON
  217. #endif
  218. #endif
  219.  
  220. static int
  221. not_here(s)
  222. char *s;
  223. {
  224.     croak("POSIX::%s not implemented on this architecture", s);
  225.     return -1;
  226. }
  227.  
  228. static double
  229. constant(name, arg)
  230. char *name;
  231. int arg;
  232. {
  233.     errno = 0;
  234.     switch (*name) {
  235.     case 'A':
  236.     if (strEQ(name, "ARG_MAX"))
  237. #ifdef ARG_MAX
  238.         return ARG_MAX;
  239. #else
  240.         goto not_there;
  241. #endif
  242.     break;
  243.     case 'B':
  244.     if (strEQ(name, "BUFSIZ"))
  245. #ifdef BUFSIZ
  246.         return BUFSIZ;
  247. #else
  248.         goto not_there;
  249. #endif
  250.     if (strEQ(name, "BRKINT"))
  251. #ifdef BRKINT
  252.         return BRKINT;
  253. #else
  254.         goto not_there;
  255. #endif
  256.     if (strEQ(name, "B9600"))
  257. #ifdef B9600
  258.         return B9600;
  259. #else
  260.         goto not_there;
  261. #endif
  262.     if (strEQ(name, "B19200"))
  263. #ifdef B19200
  264.         return B19200;
  265. #else
  266.         goto not_there;
  267. #endif
  268.     if (strEQ(name, "B38400"))
  269. #ifdef B38400
  270.         return B38400;
  271. #else
  272.         goto not_there;
  273. #endif
  274.     if (strEQ(name, "B0"))
  275. #ifdef B0
  276.         return B0;
  277. #else
  278.         goto not_there;
  279. #endif
  280.     if (strEQ(name, "B110"))
  281. #ifdef B110
  282.         return B110;
  283. #else
  284.         goto not_there;
  285. #endif
  286.     if (strEQ(name, "B1200"))
  287. #ifdef B1200
  288.         return B1200;
  289. #else
  290.         goto not_there;
  291. #endif
  292.     if (strEQ(name, "B134"))
  293. #ifdef B134
  294.         return B134;
  295. #else
  296.         goto not_there;
  297. #endif
  298.     if (strEQ(name, "B150"))
  299. #ifdef B150
  300.         return B150;
  301. #else
  302.         goto not_there;
  303. #endif
  304.     if (strEQ(name, "B1800"))
  305. #ifdef B1800
  306.         return B1800;
  307. #else
  308.         goto not_there;
  309. #endif
  310.     if (strEQ(name, "B200"))
  311. #ifdef B200
  312.         return B200;
  313. #else
  314.         goto not_there;
  315. #endif
  316.     if (strEQ(name, "B2400"))
  317. #ifdef B2400
  318.         return B2400;
  319. #else
  320.         goto not_there;
  321. #endif
  322.     if (strEQ(name, "B300"))
  323. #ifdef B300
  324.         return B300;
  325. #else
  326.         goto not_there;
  327. #endif
  328.     if (strEQ(name, "B4800"))
  329. #ifdef B4800
  330.         return B4800;
  331. #else
  332.         goto not_there;
  333. #endif
  334.     if (strEQ(name, "B50"))
  335. #ifdef B50
  336.         return B50;
  337. #else
  338.         goto not_there;
  339. #endif
  340.     if (strEQ(name, "B600"))
  341. #ifdef B600
  342.         return B600;
  343. #else
  344.         goto not_there;
  345. #endif
  346.     if (strEQ(name, "B75"))
  347. #ifdef B75
  348.         return B75;
  349. #else
  350.         goto not_there;
  351. #endif
  352.     break;
  353.     case 'C':
  354.     if (strEQ(name, "CHAR_BIT"))
  355. #ifdef CHAR_BIT
  356.         return CHAR_BIT;
  357. #else
  358.         goto not_there;
  359. #endif
  360.     if (strEQ(name, "CHAR_MAX"))
  361. #ifdef CHAR_MAX
  362.         return CHAR_MAX;
  363. #else
  364.         goto not_there;
  365. #endif
  366.     if (strEQ(name, "CHAR_MIN"))
  367. #ifdef CHAR_MIN
  368.         return CHAR_MIN;
  369. #else
  370.         goto not_there;
  371. #endif
  372.     if (strEQ(name, "CHILD_MAX"))
  373. #ifdef CHILD_MAX
  374.         return CHILD_MAX;
  375. #else
  376.         goto not_there;
  377. #endif
  378.     if (strEQ(name, "CLK_TCK"))
  379. #ifdef CLK_TCK
  380.         return CLK_TCK;
  381. #else
  382.         goto not_there;
  383. #endif
  384.     if (strEQ(name, "CLOCAL"))
  385. #ifdef CLOCAL
  386.         return CLOCAL;
  387. #else
  388.         goto not_there;
  389. #endif
  390.     if (strEQ(name, "CLOCKS_PER_SEC"))
  391. #ifdef CLOCKS_PER_SEC
  392.         return CLOCKS_PER_SEC;
  393. #else
  394.         goto not_there;
  395. #endif
  396.     if (strEQ(name, "CREAD"))
  397. #ifdef CREAD
  398.         return CREAD;
  399. #else
  400.         goto not_there;
  401. #endif
  402.     if (strEQ(name, "CS5"))
  403. #ifdef CS5
  404.         return CS5;
  405. #else
  406.         goto not_there;
  407. #endif
  408.     if (strEQ(name, "CS6"))
  409. #ifdef CS6
  410.         return CS6;
  411. #else
  412.         goto not_there;
  413. #endif
  414.     if (strEQ(name, "CS7"))
  415. #ifdef CS7
  416.         return CS7;
  417. #else
  418.         goto not_there;
  419. #endif
  420.     if (strEQ(name, "CS8"))
  421. #ifdef CS8
  422.         return CS8;
  423. #else
  424.         goto not_there;
  425. #endif
  426.     if (strEQ(name, "CSIZE"))
  427. #ifdef CSIZE
  428.         return CSIZE;
  429. #else
  430.         goto not_there;
  431. #endif
  432.     if (strEQ(name, "CSTOPB"))
  433. #ifdef CSTOPB
  434.         return CSTOPB;
  435. #else
  436.         goto not_there;
  437. #endif
  438.     break;
  439.     case 'D':
  440.     if (strEQ(name, "DBL_MAX"))
  441. #ifdef DBL_MAX
  442.         return DBL_MAX;
  443. #else
  444.         goto not_there;
  445. #endif
  446.     if (strEQ(name, "DBL_MIN"))
  447. #ifdef DBL_MIN
  448.         return DBL_MIN;
  449. #else
  450.         goto not_there;
  451. #endif
  452.     if (strEQ(name, "DBL_DIG"))
  453. #ifdef DBL_DIG
  454.         return DBL_DIG;
  455. #else
  456.         goto not_there;
  457. #endif
  458.     if (strEQ(name, "DBL_EPSILON"))
  459. #ifdef DBL_EPSILON
  460.         return DBL_EPSILON;
  461. #else
  462.         goto not_there;
  463. #endif
  464.     if (strEQ(name, "DBL_MANT_DIG"))
  465. #ifdef DBL_MANT_DIG
  466.         return DBL_MANT_DIG;
  467. #else
  468.         goto not_there;
  469. #endif
  470.     if (strEQ(name, "DBL_MAX_10_EXP"))
  471. #ifdef DBL_MAX_10_EXP
  472.         return DBL_MAX_10_EXP;
  473. #else
  474.         goto not_there;
  475. #endif
  476.     if (strEQ(name, "DBL_MAX_EXP"))
  477. #ifdef DBL_MAX_EXP
  478.         return DBL_MAX_EXP;
  479. #else
  480.         goto not_there;
  481. #endif
  482.     if (strEQ(name, "DBL_MIN_10_EXP"))
  483. #ifdef DBL_MIN_10_EXP
  484.         return DBL_MIN_10_EXP;
  485. #else
  486.         goto not_there;
  487. #endif
  488.     if (strEQ(name, "DBL_MIN_EXP"))
  489. #ifdef DBL_MIN_EXP
  490.         return DBL_MIN_EXP;
  491. #else
  492.         goto not_there;
  493. #endif
  494.     break;
  495.     case 'E':
  496.     switch (name[1]) {
  497.     case 'A':
  498.         if (strEQ(name, "EACCES"))
  499. #ifdef EACCES
  500.         return EACCES;
  501. #else
  502.         goto not_there;
  503. #endif
  504.         if (strEQ(name, "EAGAIN"))
  505. #ifdef EAGAIN
  506.         return EAGAIN;
  507. #else
  508.         goto not_there;
  509. #endif
  510.         break;
  511.     case 'B':
  512.         if (strEQ(name, "EBADF"))
  513. #ifdef EBADF
  514.         return EBADF;
  515. #else
  516.         goto not_there;
  517. #endif
  518.         if (strEQ(name, "EBUSY"))
  519. #ifdef EBUSY
  520.         return EBUSY;
  521. #else
  522.         goto not_there;
  523. #endif
  524.         break;
  525.     case 'C':
  526.         if (strEQ(name, "ECHILD"))
  527. #ifdef ECHILD
  528.         return ECHILD;
  529. #else
  530.         goto not_there;
  531. #endif
  532.         if (strEQ(name, "ECHO"))
  533. #ifdef ECHO
  534.         return ECHO;
  535. #else
  536.         goto not_there;
  537. #endif
  538.         if (strEQ(name, "ECHOE"))
  539. #ifdef ECHOE
  540.         return ECHOE;
  541. #else
  542.         goto not_there;
  543. #endif
  544.         if (strEQ(name, "ECHOK"))
  545. #ifdef ECHOK
  546.         return ECHOK;
  547. #else
  548.         goto not_there;
  549. #endif
  550.         if (strEQ(name, "ECHONL"))
  551. #ifdef ECHONL
  552.         return ECHONL;
  553. #else
  554.         goto not_there;
  555. #endif
  556.         break;
  557.     case 'D':
  558.         if (strEQ(name, "EDEADLK"))
  559. #ifdef EDEADLK
  560.         return EDEADLK;
  561. #else
  562.         goto not_there;
  563. #endif
  564.         if (strEQ(name, "EDOM"))
  565. #ifdef EDOM
  566.         return EDOM;
  567. #else
  568.         goto not_there;
  569. #endif
  570.         break;
  571.     case 'E':
  572.         if (strEQ(name, "EEXIST"))
  573. #ifdef EEXIST
  574.         return EEXIST;
  575. #else
  576.         goto not_there;
  577. #endif
  578.         break;
  579.     case 'F':
  580.         if (strEQ(name, "EFAULT"))
  581. #ifdef EFAULT
  582.         return EFAULT;
  583. #else
  584.         goto not_there;
  585. #endif
  586.         if (strEQ(name, "EFBIG"))
  587. #ifdef EFBIG
  588.         return EFBIG;
  589. #else
  590.         goto not_there;
  591. #endif
  592.         break;
  593.     case 'I':
  594.         if (strEQ(name, "EINTR"))
  595. #ifdef EINTR
  596.         return EINTR;
  597. #else
  598.         goto not_there;
  599. #endif
  600.         if (strEQ(name, "EINVAL"))
  601. #ifdef EINVAL
  602.         return EINVAL;
  603. #else
  604.         goto not_there;
  605. #endif
  606.         if (strEQ(name, "EIO"))
  607. #ifdef EIO
  608.         return EIO;
  609. #else
  610.         goto not_there;
  611. #endif
  612.         if (strEQ(name, "EISDIR"))
  613. #ifdef EISDIR
  614.         return EISDIR;
  615. #else
  616.         goto not_there;
  617. #endif
  618.         break;
  619.     case 'M':
  620.         if (strEQ(name, "EMFILE"))
  621. #ifdef EMFILE
  622.         return EMFILE;
  623. #else
  624.         goto not_there;
  625. #endif
  626.         if (strEQ(name, "EMLINK"))
  627. #ifdef EMLINK
  628.         return EMLINK;
  629. #else
  630.         goto not_there;
  631. #endif
  632.         break;
  633.     case 'N':
  634.         if (strEQ(name, "ENOMEM"))
  635. #ifdef ENOMEM
  636.         return ENOMEM;
  637. #else
  638.         goto not_there;
  639. #endif
  640.         if (strEQ(name, "ENOSPC"))
  641. #ifdef ENOSPC
  642.         return ENOSPC;
  643. #else
  644.         goto not_there;
  645. #endif
  646.         if (strEQ(name, "ENOEXEC"))
  647. #ifdef ENOEXEC
  648.         return ENOEXEC;
  649. #else
  650.         goto not_there;
  651. #endif
  652.         if (strEQ(name, "ENOTTY"))
  653. #ifdef ENOTTY
  654.         return ENOTTY;
  655. #else
  656.         goto not_there;
  657. #endif
  658.         if (strEQ(name, "ENOTDIR"))
  659. #ifdef ENOTDIR
  660.         return ENOTDIR;
  661. #else
  662.         goto not_there;
  663. #endif
  664.         if (strEQ(name, "ENOTEMPTY"))
  665. #ifdef ENOTEMPTY
  666.         return ENOTEMPTY;
  667. #else
  668.         goto not_there;
  669. #endif
  670.         if (strEQ(name, "ENFILE"))
  671. #ifdef ENFILE
  672.         return ENFILE;
  673. #else
  674.         goto not_there;
  675. #endif
  676.         if (strEQ(name, "ENODEV"))
  677. #ifdef ENODEV
  678.         return ENODEV;
  679. #else
  680.         goto not_there;
  681. #endif
  682.         if (strEQ(name, "ENOENT"))
  683. #ifdef ENOENT
  684.         return ENOENT;
  685. #else
  686.         goto not_there;
  687. #endif
  688.         if (strEQ(name, "ENOLCK"))
  689. #ifdef ENOLCK
  690.         return ENOLCK;
  691. #else
  692.         goto not_there;
  693. #endif
  694.         if (strEQ(name, "ENOSYS"))
  695. #ifdef ENOSYS
  696.         return ENOSYS;
  697. #else
  698.         goto not_there;
  699. #endif
  700.         if (strEQ(name, "ENXIO"))
  701. #ifdef ENXIO
  702.         return ENXIO;
  703. #else
  704.         goto not_there;
  705. #endif
  706.         if (strEQ(name, "ENAMETOOLONG"))
  707. #ifdef ENAMETOOLONG
  708.         return ENAMETOOLONG;
  709. #else
  710.         goto not_there;
  711. #endif
  712.         break;
  713.     case 'O':
  714.         if (strEQ(name, "EOF"))
  715. #ifdef EOF
  716.         return EOF;
  717. #else
  718.         goto not_there;
  719. #endif
  720.         break;
  721.     case 'P':
  722.         if (strEQ(name, "EPERM"))
  723. #ifdef EPERM
  724.         return EPERM;
  725. #else
  726.         goto not_there;
  727. #endif
  728.         if (strEQ(name, "EPIPE"))
  729. #ifdef EPIPE
  730.         return EPIPE;
  731. #else
  732.         goto not_there;
  733. #endif
  734.         break;
  735.     case 'R':
  736.         if (strEQ(name, "ERANGE"))
  737. #ifdef ERANGE
  738.         return ERANGE;
  739. #else
  740.         goto not_there;
  741. #endif
  742.         if (strEQ(name, "EROFS"))
  743. #ifdef EROFS
  744.         return EROFS;
  745. #else
  746.         goto not_there;
  747. #endif
  748.         break;
  749.     case 'S':
  750.         if (strEQ(name, "ESPIPE"))
  751. #ifdef ESPIPE
  752.         return ESPIPE;
  753. #else
  754.         goto not_there;
  755. #endif
  756.         if (strEQ(name, "ESRCH"))
  757. #ifdef ESRCH
  758.         return ESRCH;
  759. #else
  760.         goto not_there;
  761. #endif
  762.         break;
  763.     case 'X':
  764.         if (strEQ(name, "EXIT_FAILURE"))
  765. #ifdef EXIT_FAILURE
  766.         return EXIT_FAILURE;
  767. #else
  768.         return 1;
  769. #endif
  770.         if (strEQ(name, "EXIT_SUCCESS"))
  771. #ifdef EXIT_SUCCESS
  772.         return EXIT_SUCCESS;
  773. #else
  774.         return 0;
  775. #endif
  776.         if (strEQ(name, "EXDEV"))
  777. #ifdef EXDEV
  778.         return EXDEV;
  779. #else
  780.         goto not_there;
  781. #endif
  782.         break;
  783.     }
  784.     if (strEQ(name, "E2BIG"))
  785. #ifdef E2BIG
  786.         return E2BIG;
  787. #else
  788.         goto not_there;
  789. #endif
  790.     break;
  791.     case 'F':
  792.     if (strnEQ(name, "FLT_", 4)) {
  793.         if (strEQ(name, "FLT_MAX"))
  794. #ifdef FLT_MAX
  795.         return FLT_MAX;
  796. #else
  797.         goto not_there;
  798. #endif
  799.         if (strEQ(name, "FLT_MIN"))
  800. #ifdef FLT_MIN
  801.         return FLT_MIN;
  802. #else
  803.         goto not_there;
  804. #endif
  805.         if (strEQ(name, "FLT_ROUNDS"))
  806. #ifdef FLT_ROUNDS
  807.         return FLT_ROUNDS;
  808. #else
  809.         goto not_there;
  810. #endif
  811.         if (strEQ(name, "FLT_DIG"))
  812. #ifdef FLT_DIG
  813.         return FLT_DIG;
  814. #else
  815.         goto not_there;
  816. #endif
  817.         if (strEQ(name, "FLT_EPSILON"))
  818. #ifdef FLT_EPSILON
  819.         return FLT_EPSILON;
  820. #else
  821.         goto not_there;
  822. #endif
  823.         if (strEQ(name, "FLT_MANT_DIG"))
  824. #ifdef FLT_MANT_DIG
  825.         return FLT_MANT_DIG;
  826. #else
  827.         goto not_there;
  828. #endif
  829.         if (strEQ(name, "FLT_MAX_10_EXP"))
  830. #ifdef FLT_MAX_10_EXP
  831.         return FLT_MAX_10_EXP;
  832. #else
  833.         goto not_there;
  834. #endif
  835.         if (strEQ(name, "FLT_MAX_EXP"))
  836. #ifdef FLT_MAX_EXP
  837.         return FLT_MAX_EXP;
  838. #else
  839.         goto not_there;
  840. #endif
  841.         if (strEQ(name, "FLT_MIN_10_EXP"))
  842. #ifdef FLT_MIN_10_EXP
  843.         return FLT_MIN_10_EXP;
  844. #else
  845.         goto not_there;
  846. #endif
  847.         if (strEQ(name, "FLT_MIN_EXP"))
  848. #ifdef FLT_MIN_EXP
  849.         return FLT_MIN_EXP;
  850. #else
  851.         goto not_there;
  852. #endif
  853.         if (strEQ(name, "FLT_RADIX"))
  854. #ifdef FLT_RADIX
  855.         return FLT_RADIX;
  856. #else
  857.         goto not_there;
  858. #endif
  859.         break;
  860.     }
  861.     if (strnEQ(name, "F_", 2)) {
  862.         if (strEQ(name, "F_DUPFD"))
  863. #ifdef F_DUPFD
  864.         return F_DUPFD;
  865. #else
  866.         goto not_there;
  867. #endif
  868.         if (strEQ(name, "F_GETFD"))
  869. #ifdef F_GETFD
  870.         return F_GETFD;
  871. #else
  872.         goto not_there;
  873. #endif
  874.         if (strEQ(name, "F_GETFL"))
  875. #ifdef F_GETFL
  876.         return F_GETFL;
  877. #else
  878.         goto not_there;
  879. #endif
  880.         if (strEQ(name, "F_GETLK"))
  881. #ifdef F_GETLK
  882.         return F_GETLK;
  883. #else
  884.         goto not_there;
  885. #endif
  886.         if (strEQ(name, "F_OK"))
  887. #ifdef F_OK
  888.         return F_OK;
  889. #else
  890.         goto not_there;
  891. #endif
  892.         if (strEQ(name, "F_RDLCK"))
  893. #ifdef F_RDLCK
  894.         return F_RDLCK;
  895. #else
  896.         goto not_there;
  897. #endif
  898.         if (strEQ(name, "F_SETFD"))
  899. #ifdef F_SETFD
  900.         return F_SETFD;
  901. #else
  902.         goto not_there;
  903. #endif
  904.         if (strEQ(name, "F_SETFL"))
  905. #ifdef F_SETFL
  906.         return F_SETFL;
  907. #else
  908.         goto not_there;
  909. #endif
  910.         if (strEQ(name, "F_SETLK"))
  911. #ifdef F_SETLK
  912.         return F_SETLK;
  913. #else
  914.         goto not_there;
  915. #endif
  916.         if (strEQ(name, "F_SETLKW"))
  917. #ifdef F_SETLKW
  918.         return F_SETLKW;
  919. #else
  920.         goto not_there;
  921. #endif
  922.         if (strEQ(name, "F_UNLCK"))
  923. #ifdef F_UNLCK
  924.         return F_UNLCK;
  925. #else
  926.         goto not_there;
  927. #endif
  928.         if (strEQ(name, "F_WRLCK"))
  929. #ifdef F_WRLCK
  930.         return F_WRLCK;
  931. #else
  932.         goto not_there;
  933. #endif
  934.         break;
  935.     }
  936.     if (strEQ(name, "FD_CLOEXEC")) return FD_CLOEXEC;
  937.     if (strEQ(name, "FILENAME_MAX"))
  938. #ifdef FILENAME_MAX
  939.         return FILENAME_MAX;
  940. #else
  941.         goto not_there;
  942. #endif
  943.     break;
  944.     case 'H':
  945.     if (strEQ(name, "HUGE_VAL"))
  946. #ifdef HUGE_VAL
  947.         return HUGE_VAL;
  948. #else
  949.         goto not_there;
  950. #endif
  951.     if (strEQ(name, "HUPCL"))
  952. #ifdef HUPCL
  953.         return HUPCL;
  954. #else
  955.         goto not_there;
  956. #endif
  957.     break;
  958.     case 'I':
  959.     if (strEQ(name, "INT_MAX"))
  960. #ifdef INT_MAX
  961.         return INT_MAX;
  962. #else
  963.         goto not_there;
  964. #endif
  965.     if (strEQ(name, "INT_MIN"))
  966. #ifdef INT_MIN
  967.         return INT_MIN;
  968. #else
  969.         goto not_there;
  970. #endif
  971.     if (strEQ(name, "ICANON"))
  972. #ifdef ICANON
  973.         return ICANON;
  974. #else
  975.         goto not_there;
  976. #endif
  977.     if (strEQ(name, "ICRNL"))
  978. #ifdef ICRNL
  979.         return ICRNL;
  980. #else
  981.         goto not_there;
  982. #endif
  983.     if (strEQ(name, "IEXTEN"))
  984. #ifdef IEXTEN
  985.         return IEXTEN;
  986. #else
  987.         goto not_there;
  988. #endif
  989.     if (strEQ(name, "IGNBRK"))
  990. #ifdef IGNBRK
  991.         return IGNBRK;
  992. #else
  993.         goto not_there;
  994. #endif
  995.     if (strEQ(name, "IGNCR"))
  996. #ifdef IGNCR
  997.         return IGNCR;
  998. #else
  999.         goto not_there;
  1000. #endif
  1001.     if (strEQ(name, "IGNPAR"))
  1002. #ifdef IGNPAR
  1003.         return IGNPAR;
  1004. #else
  1005.         goto not_there;
  1006. #endif
  1007.     if (strEQ(name, "INLCR"))
  1008. #ifdef INLCR
  1009.         return INLCR;
  1010. #else
  1011.         goto not_there;
  1012. #endif
  1013.     if (strEQ(name, "INPCK"))
  1014. #ifdef INPCK
  1015.         return INPCK;
  1016. #else
  1017.         goto not_there;
  1018. #endif
  1019.     if (strEQ(name, "ISIG"))
  1020. #ifdef ISIG
  1021.         return ISIG;
  1022. #else
  1023.         goto not_there;
  1024. #endif
  1025.     if (strEQ(name, "ISTRIP"))
  1026. #ifdef ISTRIP
  1027.         return ISTRIP;
  1028. #else
  1029.         goto not_there;
  1030. #endif
  1031.     if (strEQ(name, "IXOFF"))
  1032. #ifdef IXOFF
  1033.         return IXOFF;
  1034. #else
  1035.         goto not_there;
  1036. #endif
  1037.     if (strEQ(name, "IXON"))
  1038. #ifdef IXON
  1039.         return IXON;
  1040. #else
  1041.         goto not_there;
  1042. #endif
  1043.     break;
  1044.     case 'L':
  1045.     if (strnEQ(name, "LC_", 3)) {
  1046.         if (strEQ(name, "LC_ALL"))
  1047. #ifdef LC_ALL
  1048.         return LC_ALL;
  1049. #else
  1050.         goto not_there;
  1051. #endif
  1052.         if (strEQ(name, "LC_COLLATE"))
  1053. #ifdef LC_COLLATE
  1054.         return LC_COLLATE;
  1055. #else
  1056.         goto not_there;
  1057. #endif
  1058.         if (strEQ(name, "LC_CTYPE"))
  1059. #ifdef LC_CTYPE
  1060.         return LC_CTYPE;
  1061. #else
  1062.         goto not_there;
  1063. #endif
  1064.         if (strEQ(name, "LC_MONETARY"))
  1065. #ifdef LC_MONETARY
  1066.         return LC_MONETARY;
  1067. #else
  1068.         goto not_there;
  1069. #endif
  1070.         if (strEQ(name, "LC_NUMERIC"))
  1071. #ifdef LC_NUMERIC
  1072.         return LC_NUMERIC;
  1073. #else
  1074.         goto not_there;
  1075. #endif
  1076.         if (strEQ(name, "LC_TIME"))
  1077. #ifdef LC_TIME
  1078.         return LC_TIME;
  1079. #else
  1080.         goto not_there;
  1081. #endif
  1082.         break;
  1083.     }
  1084.     if (strnEQ(name, "LDBL_", 5)) {
  1085.         if (strEQ(name, "LDBL_MAX"))
  1086. #ifdef LDBL_MAX
  1087.         return LDBL_MAX;
  1088. #else
  1089.         goto not_there;
  1090. #endif
  1091.         if (strEQ(name, "LDBL_MIN"))
  1092. #ifdef LDBL_MIN
  1093.         return LDBL_MIN;
  1094. #else
  1095.         goto not_there;
  1096. #endif
  1097.         if (strEQ(name, "LDBL_DIG"))
  1098. #ifdef LDBL_DIG
  1099.         return LDBL_DIG;
  1100. #else
  1101.         goto not_there;
  1102. #endif
  1103.         if (strEQ(name, "LDBL_EPSILON"))
  1104. #ifdef LDBL_EPSILON
  1105.         return LDBL_EPSILON;
  1106. #else
  1107.         goto not_there;
  1108. #endif
  1109.         if (strEQ(name, "LDBL_MANT_DIG"))
  1110. #ifdef LDBL_MANT_DIG
  1111.         return LDBL_MANT_DIG;
  1112. #else
  1113.         goto not_there;
  1114. #endif
  1115.         if (strEQ(name, "LDBL_MAX_10_EXP"))
  1116. #ifdef LDBL_MAX_10_EXP
  1117.         return LDBL_MAX_10_EXP;
  1118. #else
  1119.         goto not_there;
  1120. #endif
  1121.         if (strEQ(name, "LDBL_MAX_EXP"))
  1122. #ifdef LDBL_MAX_EXP
  1123.         return LDBL_MAX_EXP;
  1124. #else
  1125.         goto not_there;
  1126. #endif
  1127.         if (strEQ(name, "LDBL_MIN_10_EXP"))
  1128. #ifdef LDBL_MIN_10_EXP
  1129.         return LDBL_MIN_10_EXP;
  1130. #else
  1131.         goto not_there;
  1132. #endif
  1133.         if (strEQ(name, "LDBL_MIN_EXP"))
  1134. #ifdef LDBL_MIN_EXP
  1135.         return LDBL_MIN_EXP;
  1136. #else
  1137.         goto not_there;
  1138. #endif
  1139.         break;
  1140.     }
  1141.     if (strnEQ(name, "L_", 2)) {
  1142.         if (strEQ(name, "L_ctermid"))
  1143. #ifdef L_ctermid
  1144.         return L_ctermid;
  1145. #else
  1146.         goto not_there;
  1147. #endif
  1148.         if (strEQ(name, "L_cuserid"))
  1149. #ifdef L_cuserid
  1150.         return L_cuserid;
  1151. #else
  1152.         goto not_there;
  1153. #endif
  1154.         if (strEQ(name, "L_tmpname"))
  1155. #ifdef L_tmpname
  1156.         return L_tmpname;
  1157. #else
  1158.         goto not_there;
  1159. #endif
  1160.         break;
  1161.     }
  1162.     if (strEQ(name, "LONG_MAX"))
  1163. #ifdef LONG_MAX
  1164.         return LONG_MAX;
  1165. #else
  1166.         goto not_there;
  1167. #endif
  1168.     if (strEQ(name, "LONG_MIN"))
  1169. #ifdef LONG_MIN
  1170.         return LONG_MIN;
  1171. #else
  1172.         goto not_there;
  1173. #endif
  1174.     if (strEQ(name, "LINK_MAX"))
  1175. #ifdef LINK_MAX
  1176.         return LINK_MAX;
  1177. #else
  1178.         goto not_there;
  1179. #endif
  1180.     break;
  1181.     case 'M':
  1182.     if (strEQ(name, "MAX_CANON"))
  1183. #ifdef MAX_CANON
  1184.         return MAX_CANON;
  1185. #else
  1186.         goto not_there;
  1187. #endif
  1188.     if (strEQ(name, "MAX_INPUT"))
  1189. #ifdef MAX_INPUT
  1190.         return MAX_INPUT;
  1191. #else
  1192.         goto not_there;
  1193. #endif
  1194.     if (strEQ(name, "MB_CUR_MAX"))
  1195. #ifdef MB_CUR_MAX
  1196.         return MB_CUR_MAX;
  1197. #else
  1198.         goto not_there;
  1199. #endif
  1200.     if (strEQ(name, "MB_LEN_MAX"))
  1201. #ifdef MB_LEN_MAX
  1202.         return MB_LEN_MAX;
  1203. #else
  1204.         goto not_there;
  1205. #endif
  1206.     break;
  1207.     case 'N':
  1208.     if (strEQ(name, "NULL")) return 0;
  1209.     if (strEQ(name, "NAME_MAX"))
  1210. #ifdef NAME_MAX
  1211.         return NAME_MAX;
  1212. #else
  1213.         goto not_there;
  1214. #endif
  1215.     if (strEQ(name, "NCCS"))
  1216. #ifdef NCCS
  1217.         return NCCS;
  1218. #else
  1219.         goto not_there;
  1220. #endif
  1221.     if (strEQ(name, "NGROUPS_MAX"))
  1222. #ifdef NGROUPS_MAX
  1223.         return NGROUPS_MAX;
  1224. #else
  1225.         goto not_there;
  1226. #endif
  1227.     if (strEQ(name, "NOFLSH"))
  1228. #ifdef NOFLSH
  1229.         return NOFLSH;
  1230. #else
  1231.         goto not_there;
  1232. #endif
  1233.     break;
  1234.     case 'O':
  1235.     if (strnEQ(name, "O_", 2)) {
  1236.         if (strEQ(name, "O_APPEND"))
  1237. #ifdef O_APPEND
  1238.         return O_APPEND;
  1239. #else
  1240.         goto not_there;
  1241. #endif
  1242.         if (strEQ(name, "O_CREAT"))
  1243. #ifdef O_CREAT
  1244.         return O_CREAT;
  1245. #else
  1246.         goto not_there;
  1247. #endif
  1248.         if (strEQ(name, "O_TRUNC"))
  1249. #ifdef O_TRUNC
  1250.         return O_TRUNC;
  1251. #else
  1252.         goto not_there;
  1253. #endif
  1254.         if (strEQ(name, "O_RDONLY"))
  1255. #ifdef O_RDONLY
  1256.         return O_RDONLY;
  1257. #else
  1258.         goto not_there;
  1259. #endif
  1260.         if (strEQ(name, "O_RDWR"))
  1261. #ifdef O_RDWR
  1262.         return O_RDWR;
  1263. #else
  1264.         goto not_there;
  1265. #endif
  1266.         if (strEQ(name, "O_WRONLY"))
  1267. #ifdef O_WRONLY
  1268.         return O_WRONLY;
  1269. #else
  1270.         goto not_there;
  1271. #endif
  1272.         if (strEQ(name, "O_EXCL"))
  1273. #ifdef O_EXCL
  1274.         return O_EXCL;
  1275. #else
  1276.         goto not_there;
  1277. #endif
  1278.         if (strEQ(name, "O_NOCTTY"))
  1279. #ifdef O_NOCTTY
  1280.         return O_NOCTTY;
  1281. #else
  1282.         goto not_there;
  1283. #endif
  1284.         if (strEQ(name, "O_NONBLOCK"))
  1285. #ifdef O_NONBLOCK
  1286.         return O_NONBLOCK;
  1287. #else
  1288.         goto not_there;
  1289. #endif
  1290.         if (strEQ(name, "O_ACCMODE"))
  1291. #ifdef O_ACCMODE
  1292.         return O_ACCMODE;
  1293. #else
  1294.         goto not_there;
  1295. #endif
  1296.         break;
  1297.     }
  1298.     if (strEQ(name, "OPEN_MAX"))
  1299. #ifdef OPEN_MAX
  1300.         return OPEN_MAX;
  1301. #else
  1302.         goto not_there;
  1303. #endif
  1304.     if (strEQ(name, "OPOST"))
  1305. #ifdef OPOST
  1306.         return OPOST;
  1307. #else
  1308.         goto not_there;
  1309. #endif
  1310.     break;
  1311.     case 'P':
  1312.     if (strEQ(name, "PATH_MAX"))
  1313. #ifdef PATH_MAX
  1314.         return PATH_MAX;
  1315. #else
  1316.         goto not_there;
  1317. #endif
  1318.     if (strEQ(name, "PARENB"))
  1319. #ifdef PARENB
  1320.         return PARENB;
  1321. #else
  1322.         goto not_there;
  1323. #endif
  1324.     if (strEQ(name, "PARMRK"))
  1325. #ifdef PARMRK
  1326.         return PARMRK;
  1327. #else
  1328.         goto not_there;
  1329. #endif
  1330.     if (strEQ(name, "PARODD"))
  1331. #ifdef PARODD
  1332.         return PARODD;
  1333. #else
  1334.         goto not_there;
  1335. #endif
  1336.     if (strEQ(name, "PIPE_BUF"))
  1337. #ifdef PIPE_BUF
  1338.         return PIPE_BUF;
  1339. #else
  1340.         goto not_there;
  1341. #endif
  1342.     break;
  1343.     case 'R':
  1344.     if (strEQ(name, "RAND_MAX"))
  1345. #ifdef RAND_MAX
  1346.         return RAND_MAX;
  1347. #else
  1348.         goto not_there;
  1349. #endif
  1350.     if (strEQ(name, "R_OK"))
  1351. #ifdef R_OK
  1352.         return R_OK;
  1353. #else
  1354.         goto not_there;
  1355. #endif
  1356.     break;
  1357.     case 'S':
  1358.     if (strnEQ(name, "SIG", 3)) {
  1359.         if (name[3] == '_') {
  1360.         if (strEQ(name, "SIG_BLOCK"))
  1361. #ifdef SIG_BLOCK
  1362.             return SIG_BLOCK;
  1363. #else
  1364.             goto not_there;
  1365. #endif
  1366. #ifdef SIG_DFL
  1367.         if (strEQ(name, "SIG_DFL")) return (int)SIG_DFL;
  1368. #endif
  1369. #ifdef SIG_ERR
  1370.         if (strEQ(name, "SIG_ERR")) return (int)SIG_ERR;
  1371. #endif
  1372. #ifdef SIG_IGN
  1373.         if (strEQ(name, "SIG_IGN")) return (int)SIG_IGN;
  1374. #endif
  1375.         if (strEQ(name, "SIG_SETMASK"))
  1376. #ifdef SIG_SETMASK
  1377.             return SIG_SETMASK;
  1378. #else
  1379.             goto not_there;
  1380. #endif
  1381.         if (strEQ(name, "SIG_UNBLOCK"))
  1382. #ifdef SIG_UNBLOCK
  1383.             return SIG_UNBLOCK;
  1384. #else
  1385.             goto not_there;
  1386. #endif
  1387.         break;
  1388.         }
  1389.         if (strEQ(name, "SIGABRT"))
  1390. #ifdef SIGABRT
  1391.         return SIGABRT;
  1392. #else
  1393.         goto not_there;
  1394. #endif
  1395.         if (strEQ(name, "SIGALRM"))
  1396. #ifdef SIGALRM
  1397.         return SIGALRM;
  1398. #else
  1399.         goto not_there;
  1400. #endif
  1401.         if (strEQ(name, "SIGCHLD"))
  1402. #ifdef SIGCHLD
  1403.         return SIGCHLD;
  1404. #else
  1405.         goto not_there;
  1406. #endif
  1407.         if (strEQ(name, "SIGCONT"))
  1408. #ifdef SIGCONT
  1409.         return SIGCONT;
  1410. #else
  1411.         goto not_there;
  1412. #endif
  1413.         if (strEQ(name, "SIGFPE"))
  1414. #ifdef SIGFPE
  1415.         return SIGFPE;
  1416. #else
  1417.         goto not_there;
  1418. #endif
  1419.         if (strEQ(name, "SIGHUP"))
  1420. #ifdef SIGHUP
  1421.         return SIGHUP;
  1422. #else
  1423.         goto not_there;
  1424. #endif
  1425.         if (strEQ(name, "SIGILL"))
  1426. #ifdef SIGILL
  1427.         return SIGILL;
  1428. #else
  1429.         goto not_there;
  1430. #endif
  1431.         if (strEQ(name, "SIGINT"))
  1432. #ifdef SIGINT
  1433.         return SIGINT;
  1434. #else
  1435.         goto not_there;
  1436. #endif
  1437.         if (strEQ(name, "SIGKILL"))
  1438. #ifdef SIGKILL
  1439.         return SIGKILL;
  1440. #else
  1441.         goto not_there;
  1442. #endif
  1443.         if (strEQ(name, "SIGPIPE"))
  1444. #ifdef SIGPIPE
  1445.         return SIGPIPE;
  1446. #else
  1447.         goto not_there;
  1448. #endif
  1449.         if (strEQ(name, "SIGQUIT"))
  1450. #ifdef SIGQUIT
  1451.         return SIGQUIT;
  1452. #else
  1453.         goto not_there;
  1454. #endif
  1455.         if (strEQ(name, "SIGSEGV"))
  1456. #ifdef SIGSEGV
  1457.         return SIGSEGV;
  1458. #else
  1459.         goto not_there;
  1460. #endif
  1461.         if (strEQ(name, "SIGSTOP"))
  1462. #ifdef SIGSTOP
  1463.         return SIGSTOP;
  1464. #else
  1465.         goto not_there;
  1466. #endif
  1467.         if (strEQ(name, "SIGTERM"))
  1468. #ifdef SIGTERM
  1469.         return SIGTERM;
  1470. #else
  1471.         goto not_there;
  1472. #endif
  1473.         if (strEQ(name, "SIGTSTP"))
  1474. #ifdef SIGTSTP
  1475.         return SIGTSTP;
  1476. #else
  1477.         goto not_there;
  1478. #endif
  1479.         if (strEQ(name, "SIGTTIN"))
  1480. #ifdef SIGTTIN
  1481.         return SIGTTIN;
  1482. #else
  1483.         goto not_there;
  1484. #endif
  1485.         if (strEQ(name, "SIGTTOU"))
  1486. #ifdef SIGTTOU
  1487.         return SIGTTOU;
  1488. #else
  1489.         goto not_there;
  1490. #endif
  1491.         if (strEQ(name, "SIGUSR1"))
  1492. #ifdef SIGUSR1
  1493.         return SIGUSR1;
  1494. #else
  1495.         goto not_there;
  1496. #endif
  1497.         if (strEQ(name, "SIGUSR2"))
  1498. #ifdef SIGUSR2
  1499.         return SIGUSR2;
  1500. #else
  1501.         goto not_there;
  1502. #endif
  1503.         break;
  1504.     }
  1505.     if (name[1] == '_') {
  1506. #ifdef S_ISBLK
  1507.         if (strEQ(name, "S_ISBLK")) return S_ISBLK(arg);
  1508. #endif
  1509. #ifdef S_ISCHR
  1510.         if (strEQ(name, "S_ISCHR")) return S_ISCHR(arg);
  1511. #endif
  1512. #ifdef S_ISDIR
  1513.         if (strEQ(name, "S_ISDIR")) return S_ISDIR(arg);
  1514. #endif
  1515. #ifdef S_ISFIFO
  1516.         if (strEQ(name, "S_ISFIFO")) return S_ISFIFO(arg);
  1517. #endif
  1518. #ifdef S_ISREG
  1519.         if (strEQ(name, "S_ISREG")) return S_ISREG(arg);
  1520. #endif
  1521.         if (strEQ(name, "S_ISGID"))
  1522. #ifdef S_ISGID
  1523.         return S_ISGID;
  1524. #else
  1525.         goto not_there;
  1526. #endif
  1527.         if (strEQ(name, "S_ISUID"))
  1528. #ifdef S_ISUID
  1529.         return S_ISUID;
  1530. #else
  1531.         goto not_there;
  1532. #endif
  1533.         if (strEQ(name, "S_IRGRP"))
  1534. #ifdef S_IRGRP
  1535.         return S_IRGRP;
  1536. #else
  1537.         goto not_there;
  1538. #endif
  1539.         if (strEQ(name, "S_IROTH"))
  1540. #ifdef S_IROTH
  1541.         return S_IROTH;
  1542. #else
  1543.         goto not_there;
  1544. #endif
  1545.         if (strEQ(name, "S_IRUSR"))
  1546. #ifdef S_IRUSR
  1547.         return S_IRUSR;
  1548. #else
  1549.         goto not_there;
  1550. #endif
  1551.         if (strEQ(name, "S_IRWXG"))
  1552. #ifdef S_IRWXG
  1553.         return S_IRWXG;
  1554. #else
  1555.         goto not_there;
  1556. #endif
  1557.         if (strEQ(name, "S_IRWXO"))
  1558. #ifdef S_IRWXO
  1559.         return S_IRWXO;
  1560. #else
  1561.         goto not_there;
  1562. #endif
  1563.         if (strEQ(name, "S_IRWXU"))
  1564. #ifdef S_IRWXU
  1565.         return S_IRWXU;
  1566. #else
  1567.         goto not_there;
  1568. #endif
  1569.         if (strEQ(name, "S_IWGRP"))
  1570. #ifdef S_IWGRP
  1571.         return S_IWGRP;
  1572. #else
  1573.         goto not_there;
  1574. #endif
  1575.         if (strEQ(name, "S_IWOTH"))
  1576. #ifdef S_IWOTH
  1577.         return S_IWOTH;
  1578. #else
  1579.         goto not_there;
  1580. #endif
  1581.         if (strEQ(name, "S_IWUSR"))
  1582. #ifdef S_IWUSR
  1583.         return S_IWUSR;
  1584. #else
  1585.         goto not_there;
  1586. #endif
  1587.         if (strEQ(name, "S_IXGRP"))
  1588. #ifdef S_IXGRP
  1589.         return S_IXGRP;
  1590. #else
  1591.         goto not_there;
  1592. #endif
  1593.         if (strEQ(name, "S_IXOTH"))
  1594. #ifdef S_IXOTH
  1595.         return S_IXOTH;
  1596. #else
  1597.         goto not_there;
  1598. #endif
  1599.         if (strEQ(name, "S_IXUSR"))
  1600. #ifdef S_IXUSR
  1601.         return S_IXUSR;
  1602. #else
  1603.         goto not_there;
  1604. #endif
  1605.         break;
  1606.     }
  1607.     if (strEQ(name, "SEEK_CUR"))
  1608. #ifdef SEEK_CUR
  1609.         return SEEK_CUR;
  1610. #else
  1611.         goto not_there;
  1612. #endif
  1613.     if (strEQ(name, "SEEK_END"))
  1614. #ifdef SEEK_END
  1615.         return SEEK_END;
  1616. #else
  1617.         goto not_there;
  1618. #endif
  1619.     if (strEQ(name, "SEEK_SET"))
  1620. #ifdef SEEK_SET
  1621.         return SEEK_SET;
  1622. #else
  1623.         goto not_there;
  1624. #endif
  1625.     if (strEQ(name, "STREAM_MAX"))
  1626. #ifdef STREAM_MAX
  1627.         return STREAM_MAX;
  1628. #else
  1629.         goto not_there;
  1630. #endif
  1631.     if (strEQ(name, "SHRT_MAX"))
  1632. #ifdef SHRT_MAX
  1633.         return SHRT_MAX;
  1634. #else
  1635.         goto not_there;
  1636. #endif
  1637.     if (strEQ(name, "SHRT_MIN"))
  1638. #ifdef SHRT_MIN
  1639.         return SHRT_MIN;
  1640. #else
  1641.         goto not_there;
  1642. #endif
  1643.     if (strEQ(name, "SA_NOCLDSTOP"))
  1644. #ifdef SA_NOCLDSTOP
  1645.         return SA_NOCLDSTOP;
  1646. #else
  1647.         goto not_there;
  1648. #endif
  1649.     if (strEQ(name, "SCHAR_MAX"))
  1650. #ifdef SCHAR_MAX
  1651.         return SCHAR_MAX;
  1652. #else
  1653.         goto not_there;
  1654. #endif
  1655.     if (strEQ(name, "SCHAR_MIN"))
  1656. #ifdef SCHAR_MIN
  1657.         return SCHAR_MIN;
  1658. #else
  1659.         goto not_there;
  1660. #endif
  1661.     if (strEQ(name, "SSIZE_MAX"))
  1662. #ifdef SSIZE_MAX
  1663.         return SSIZE_MAX;
  1664. #else
  1665.         goto not_there;
  1666. #endif
  1667.     if (strEQ(name, "STDIN_FILENO"))
  1668. #ifdef STDIN_FILENO
  1669.         return STDIN_FILENO;
  1670. #else
  1671.         goto not_there;
  1672. #endif
  1673.     if (strEQ(name, "STDOUT_FILENO"))
  1674. #ifdef STDOUT_FILENO
  1675.         return STDOUT_FILENO;
  1676. #else
  1677.         goto not_there;
  1678. #endif
  1679.     if (strEQ(name, "STRERR_FILENO"))
  1680. #ifdef STRERR_FILENO
  1681.         return STRERR_FILENO;
  1682. #else
  1683.         goto not_there;
  1684. #endif
  1685.     break;
  1686.     case 'T':
  1687.     if (strEQ(name, "TCIFLUSH"))
  1688. #ifdef TCIFLUSH
  1689.         return TCIFLUSH;
  1690. #else
  1691.         goto not_there;
  1692. #endif
  1693.     if (strEQ(name, "TCIOFF"))
  1694. #ifdef TCIOFF
  1695.         return TCIOFF;
  1696. #else
  1697.         goto not_there;
  1698. #endif
  1699.     if (strEQ(name, "TCIOFLUSH"))
  1700. #ifdef TCIOFLUSH
  1701.         return TCIOFLUSH;
  1702. #else
  1703.         goto not_there;
  1704. #endif
  1705.     if (strEQ(name, "TCION"))
  1706. #ifdef TCION
  1707.         return TCION;
  1708. #else
  1709.         goto not_there;
  1710. #endif
  1711.     if (strEQ(name, "TCOFLUSH"))
  1712. #ifdef TCOFLUSH
  1713.         return TCOFLUSH;
  1714. #else
  1715.         goto not_there;
  1716. #endif
  1717.     if (strEQ(name, "TCOOFF"))
  1718. #ifdef TCOOFF
  1719.         return TCOOFF;
  1720. #else
  1721.         goto not_there;
  1722. #endif
  1723.     if (strEQ(name, "TCOON"))
  1724. #ifdef TCOON
  1725.         return TCOON;
  1726. #else
  1727.         goto not_there;
  1728. #endif
  1729.     if (strEQ(name, "TCSADRAIN"))
  1730. #ifdef TCSADRAIN
  1731.         return TCSADRAIN;
  1732. #else
  1733.         goto not_there;
  1734. #endif
  1735.     if (strEQ(name, "TCSAFLUSH"))
  1736. #ifdef TCSAFLUSH
  1737.         return TCSAFLUSH;
  1738. #else
  1739.         goto not_there;
  1740. #endif
  1741.     if (strEQ(name, "TCSANOW"))
  1742. #ifdef TCSANOW
  1743.         return TCSANOW;
  1744. #else
  1745.         goto not_there;
  1746. #endif
  1747.     if (strEQ(name, "TMP_MAX"))
  1748. #ifdef TMP_MAX
  1749.         return TMP_MAX;
  1750. #else
  1751.         goto not_there;
  1752. #endif
  1753.     if (strEQ(name, "TOSTOP"))
  1754. #ifdef TOSTOP
  1755.         return TOSTOP;
  1756. #else
  1757.         goto not_there;
  1758. #endif
  1759.     if (strEQ(name, "TZNAME_MAX"))
  1760. #ifdef TZNAME_MAX
  1761.         return TZNAME_MAX;
  1762. #else
  1763.         goto not_there;
  1764. #endif
  1765.     break;
  1766.     case 'U':
  1767.     if (strEQ(name, "UCHAR_MAX"))
  1768. #ifdef UCHAR_MAX
  1769.         return UCHAR_MAX;
  1770. #else
  1771.         goto not_there;
  1772. #endif
  1773.     if (strEQ(name, "UINT_MAX"))
  1774. #ifdef UINT_MAX
  1775.         return UINT_MAX;
  1776. #else
  1777.         goto not_there;
  1778. #endif
  1779.     if (strEQ(name, "ULONG_MAX"))
  1780. #ifdef ULONG_MAX
  1781.         return ULONG_MAX;
  1782. #else
  1783.         goto not_there;
  1784. #endif
  1785.     if (strEQ(name, "USHRT_MAX"))
  1786. #ifdef USHRT_MAX
  1787.         return USHRT_MAX;
  1788. #else
  1789.         goto not_there;
  1790. #endif
  1791.     break;
  1792.     case 'V':
  1793.     if (strEQ(name, "VEOF"))
  1794. #ifdef VEOF
  1795.         return VEOF;
  1796. #else
  1797.         goto not_there;
  1798. #endif
  1799.     if (strEQ(name, "VEOL"))
  1800. #ifdef VEOL
  1801.         return VEOL;
  1802. #else
  1803.         goto not_there;
  1804. #endif
  1805.     if (strEQ(name, "VERASE"))
  1806. #ifdef VERASE
  1807.         return VERASE;
  1808. #else
  1809.         goto not_there;
  1810. #endif
  1811.     if (strEQ(name, "VINTR"))
  1812. #ifdef VINTR
  1813.         return VINTR;
  1814. #else
  1815.         goto not_there;
  1816. #endif
  1817.     if (strEQ(name, "VKILL"))
  1818. #ifdef VKILL
  1819.         return VKILL;
  1820. #else
  1821.         goto not_there;
  1822. #endif
  1823.     if (strEQ(name, "VMIN"))
  1824. #ifdef VMIN
  1825.         return VMIN;
  1826. #else
  1827.         goto not_there;
  1828. #endif
  1829.     if (strEQ(name, "VQUIT"))
  1830. #ifdef VQUIT
  1831.         return VQUIT;
  1832. #else
  1833.         goto not_there;
  1834. #endif
  1835.     if (strEQ(name, "VSTART"))
  1836. #ifdef VSTART
  1837.         return VSTART;
  1838. #else
  1839.         goto not_there;
  1840. #endif
  1841.     if (strEQ(name, "VSTOP"))
  1842. #ifdef VSTOP
  1843.         return VSTOP;
  1844. #else
  1845.         goto not_there;
  1846. #endif
  1847.     if (strEQ(name, "VSUSP"))
  1848. #ifdef VSUSP
  1849.         return VSUSP;
  1850. #else
  1851.         goto not_there;
  1852. #endif
  1853.     if (strEQ(name, "VTIME"))
  1854. #ifdef VTIME
  1855.         return VTIME;
  1856. #else
  1857.         goto not_there;
  1858. #endif
  1859.     break;
  1860.     case 'W':
  1861.     if (strEQ(name, "W_OK"))
  1862. #ifdef W_OK
  1863.         return W_OK;
  1864. #else
  1865.         goto not_there;
  1866. #endif
  1867. #ifdef WEXITSTATUS
  1868.     if (strEQ(name, "WEXITSTATUS")) return WEXITSTATUS(arg);
  1869. #endif
  1870. #ifdef WIFEXITED
  1871.     if (strEQ(name, "WIFEXITED")) return WIFEXITED(arg);
  1872. #endif
  1873. #ifdef WIFSIGNALED
  1874.     if (strEQ(name, "WIFSIGNALED")) return WIFSIGNALED(arg);
  1875. #endif
  1876. #ifdef WIFSTOPPED
  1877.     if (strEQ(name, "WIFSTOPPED")) return WIFSTOPPED(arg);
  1878. #endif
  1879.     if (strEQ(name, "WNOHANG"))
  1880. #ifdef WNOHANG
  1881.         return WNOHANG;
  1882. #else
  1883.         goto not_there;
  1884. #endif
  1885. #ifdef WSTOPSIG
  1886.     if (strEQ(name, "WSTOPSIG")) return WSTOPSIG(arg);
  1887. #endif
  1888. #ifdef WTERMSIG
  1889.     if (strEQ(name, "WTERMSIG")) return WTERMSIG(arg);
  1890. #endif
  1891.     if (strEQ(name, "WUNTRACED"))
  1892. #ifdef WUNTRACED
  1893.         return WUNTRACED;
  1894. #else
  1895.         goto not_there;
  1896. #endif
  1897.     break;
  1898.     case 'X':
  1899.     if (strEQ(name, "X_OK"))
  1900. #ifdef X_OK
  1901.         return X_OK;
  1902. #else
  1903.         goto not_there;
  1904. #endif
  1905.     break;
  1906.     case '_':
  1907.     if (strnEQ(name, "_PC_", 4)) {
  1908.         if (strEQ(name, "_PC_CHOWN_RESTRICTED"))
  1909. #ifdef _PC_CHOWN_RESTRICTED
  1910.         return _PC_CHOWN_RESTRICTED;
  1911. #else
  1912.         goto not_there;
  1913. #endif
  1914.         if (strEQ(name, "_PC_LINK_MAX"))
  1915. #ifdef _PC_LINK_MAX
  1916.         return _PC_LINK_MAX;
  1917. #else
  1918.         goto not_there;
  1919. #endif
  1920.         if (strEQ(name, "_PC_MAX_CANON"))
  1921. #ifdef _PC_MAX_CANON
  1922.         return _PC_MAX_CANON;
  1923. #else
  1924.         goto not_there;
  1925. #endif
  1926.         if (strEQ(name, "_PC_MAX_INPUT"))
  1927. #ifdef _PC_MAX_INPUT
  1928.         return _PC_MAX_INPUT;
  1929. #else
  1930.         goto not_there;
  1931. #endif
  1932.         if (strEQ(name, "_PC_NAME_MAX"))
  1933. #ifdef _PC_NAME_MAX
  1934.         return _PC_NAME_MAX;
  1935. #else
  1936.         goto not_there;
  1937. #endif
  1938.         if (strEQ(name, "_PC_NO_TRUNC"))
  1939. #ifdef _PC_NO_TRUNC
  1940.         return _PC_NO_TRUNC;
  1941. #else
  1942.         goto not_there;
  1943. #endif
  1944.         if (strEQ(name, "_PC_PATH_MAX"))
  1945. #ifdef _PC_PATH_MAX
  1946.         return _PC_PATH_MAX;
  1947. #else
  1948.         goto not_there;
  1949. #endif
  1950.         if (strEQ(name, "_PC_PIPE_BUF"))
  1951. #ifdef _PC_PIPE_BUF
  1952.         return _PC_PIPE_BUF;
  1953. #else
  1954.         goto not_there;
  1955. #endif
  1956.         if (strEQ(name, "_PC_VDISABLE"))
  1957. #ifdef _PC_VDISABLE
  1958.         return _PC_VDISABLE;
  1959. #else
  1960.         goto not_there;
  1961. #endif
  1962.         break;
  1963.     }
  1964.     if (strnEQ(name, "_POSIX_", 7)) {
  1965.         if (strEQ(name, "_POSIX_ARG_MAX"))
  1966. #ifdef _POSIX_ARG_MAX
  1967.         return _POSIX_ARG_MAX;
  1968. #else
  1969.         return 0;
  1970. #endif
  1971.         if (strEQ(name, "_POSIX_CHILD_MAX"))
  1972. #ifdef _POSIX_CHILD_MAX
  1973.         return _POSIX_CHILD_MAX;
  1974. #else
  1975.         return 0;
  1976. #endif
  1977.         if (strEQ(name, "_POSIX_CHOWN_RESTRICTED"))
  1978. #ifdef _POSIX_CHOWN_RESTRICTED
  1979.         return _POSIX_CHOWN_RESTRICTED;
  1980. #else
  1981.         return 0;
  1982. #endif
  1983.         if (strEQ(name, "_POSIX_JOB_CONTROL"))
  1984. #ifdef _POSIX_JOB_CONTROL
  1985.         return _POSIX_JOB_CONTROL;
  1986. #else
  1987.         return 0;
  1988. #endif
  1989.         if (strEQ(name, "_POSIX_LINK_MAX"))
  1990. #ifdef _POSIX_LINK_MAX
  1991.         return _POSIX_LINK_MAX;
  1992. #else
  1993.         return 0;
  1994. #endif
  1995.         if (strEQ(name, "_POSIX_MAX_CANON"))
  1996. #ifdef _POSIX_MAX_CANON
  1997.         return _POSIX_MAX_CANON;
  1998. #else
  1999.         return 0;
  2000. #endif
  2001.         if (strEQ(name, "_POSIX_MAX_INPUT"))
  2002. #ifdef _POSIX_MAX_INPUT
  2003.         return _POSIX_MAX_INPUT;
  2004. #else
  2005.         return 0;
  2006. #endif
  2007.         if (strEQ(name, "_POSIX_NAME_MAX"))
  2008. #ifdef _POSIX_NAME_MAX
  2009.         return _POSIX_NAME_MAX;
  2010. #else
  2011.         return 0;
  2012. #endif
  2013.         if (strEQ(name, "_POSIX_NGROUPS_MAX"))
  2014. #ifdef _POSIX_NGROUPS_MAX
  2015.         return _POSIX_NGROUPS_MAX;
  2016. #else
  2017.         return 0;
  2018. #endif
  2019.         if (strEQ(name, "_POSIX_NO_TRUNC"))
  2020. #ifdef _POSIX_NO_TRUNC
  2021.         return _POSIX_NO_TRUNC;
  2022. #else
  2023.         return 0;
  2024. #endif
  2025.         if (strEQ(name, "_POSIX_OPEN_MAX"))
  2026. #ifdef _POSIX_OPEN_MAX
  2027.         return _POSIX_OPEN_MAX;
  2028. #else
  2029.         return 0;
  2030. #endif
  2031.         if (strEQ(name, "_POSIX_PATH_MAX"))
  2032. #ifdef _POSIX_PATH_MAX
  2033.         return _POSIX_PATH_MAX;
  2034. #else
  2035.         return 0;
  2036. #endif
  2037.         if (strEQ(name, "_POSIX_PIPE_BUF"))
  2038. #ifdef _POSIX_PIPE_BUF
  2039.         return _POSIX_PIPE_BUF;
  2040. #else
  2041.         return 0;
  2042. #endif
  2043.         if (strEQ(name, "_POSIX_SAVED_IDS"))
  2044. #ifdef _POSIX_SAVED_IDS
  2045.         return _POSIX_SAVED_IDS;
  2046. #else
  2047.         return 0;
  2048. #endif
  2049.         if (strEQ(name, "_POSIX_SSIZE_MAX"))
  2050. #ifdef _POSIX_SSIZE_MAX
  2051.         return _POSIX_SSIZE_MAX;
  2052. #else
  2053.         return 0;
  2054. #endif
  2055.         if (strEQ(name, "_POSIX_STREAM_MAX"))
  2056. #ifdef _POSIX_STREAM_MAX
  2057.         return _POSIX_STREAM_MAX;
  2058. #else
  2059.         return 0;
  2060. #endif
  2061.         if (strEQ(name, "_POSIX_TZNAME_MAX"))
  2062. #ifdef _POSIX_TZNAME_MAX
  2063.         return _POSIX_TZNAME_MAX;
  2064. #else
  2065.         return 0;
  2066. #endif
  2067.         if (strEQ(name, "_POSIX_VDISABLE"))
  2068. #ifdef _POSIX_VDISABLE
  2069.         return _POSIX_VDISABLE;
  2070. #else
  2071.         return 0;
  2072. #endif
  2073.         if (strEQ(name, "_POSIX_VERSION"))
  2074. #ifdef _POSIX_VERSION
  2075.         return _POSIX_VERSION;
  2076. #else
  2077.         return 0;
  2078. #endif
  2079.         break;
  2080.     }
  2081.     if (strnEQ(name, "_SC_", 4)) {
  2082.         if (strEQ(name, "_SC_ARG_MAX"))
  2083. #ifdef _SC_ARG_MAX
  2084.         return _SC_ARG_MAX;
  2085. #else
  2086.         goto not_there;
  2087. #endif
  2088.         if (strEQ(name, "_SC_CHILD_MAX"))
  2089. #ifdef _SC_CHILD_MAX
  2090.         return _SC_CHILD_MAX;
  2091. #else
  2092.         goto not_there;
  2093. #endif
  2094.         if (strEQ(name, "_SC_CLK_TCK"))
  2095. #ifdef _SC_CLK_TCK
  2096.         return _SC_CLK_TCK;
  2097. #else
  2098.         goto not_there;
  2099. #endif
  2100.         if (strEQ(name, "_SC_JOB_CONTROL"))
  2101. #ifdef _SC_JOB_CONTROL
  2102.         return _SC_JOB_CONTROL;
  2103. #else
  2104.         goto not_there;
  2105. #endif
  2106.         if (strEQ(name, "_SC_NGROUPS_MAX"))
  2107. #ifdef _SC_NGROUPS_MAX
  2108.         return _SC_NGROUPS_MAX;
  2109. #else
  2110.         goto not_there;
  2111. #endif
  2112.         if (strEQ(name, "_SC_OPEN_MAX"))
  2113. #ifdef _SC_OPEN_MAX
  2114.         return _SC_OPEN_MAX;
  2115. #else
  2116.         goto not_there;
  2117. #endif
  2118.         if (strEQ(name, "_SC_SAVED_IDS"))
  2119. #ifdef _SC_SAVED_IDS
  2120.         return _SC_SAVED_IDS;
  2121. #else
  2122.         goto not_there;
  2123. #endif
  2124.         if (strEQ(name, "_SC_STREAM_MAX"))
  2125. #ifdef _SC_STREAM_MAX
  2126.         return _SC_STREAM_MAX;
  2127. #else
  2128.         goto not_there;
  2129. #endif
  2130.         if (strEQ(name, "_SC_TZNAME_MAX"))
  2131. #ifdef _SC_TZNAME_MAX
  2132.         return _SC_TZNAME_MAX;
  2133. #else
  2134.         goto not_there;
  2135. #endif
  2136.         if (strEQ(name, "_SC_VERSION"))
  2137. #ifdef _SC_VERSION
  2138.         return _SC_VERSION;
  2139. #else
  2140.         goto not_there;
  2141. #endif
  2142.         break;
  2143.     }
  2144.     if (strEQ(name, "_IOFBF"))
  2145. #ifdef _IOFBF
  2146.         return _IOFBF;
  2147. #else
  2148.         goto not_there;
  2149. #endif
  2150.     if (strEQ(name, "_IOLBF"))
  2151. #ifdef _IOLBF
  2152.         return _IOLBF;
  2153. #else
  2154.         goto not_there;
  2155. #endif
  2156.     if (strEQ(name, "_IONBF"))
  2157. #ifdef _IONBF
  2158.         return _IONBF;
  2159. #else
  2160.         goto not_there;
  2161. #endif
  2162.     break;
  2163.     }
  2164.     errno = EINVAL;
  2165.     return 0;
  2166.  
  2167. not_there:
  2168.     errno = ENOENT;
  2169.     return 0;
  2170. }
  2171.  
  2172. XS(XS_POSIX__SigSet_new)
  2173. {
  2174.     dXSARGS;
  2175.     if (items < 0) {
  2176.     croak("Usage: POSIX::SigSet::new(packname = \"POSIX::SigSet\", ...)");
  2177.     }
  2178.     {
  2179.     char *    packname;
  2180.     POSIX__SigSet    RETVAL;
  2181.  
  2182.     if (items < 1)
  2183.         packname = "POSIX::SigSet";
  2184.     else {
  2185.         packname = (char *)SvPV(ST(0),na);
  2186.     }
  2187.     {
  2188.         int i;
  2189.         RETVAL = (sigset_t*)safemalloc(sizeof(sigset_t));
  2190.         sigemptyset(RETVAL);
  2191.         for (i = 1; i < items; i++)
  2192.         sigaddset(RETVAL, SvIV(ST(i)));
  2193.     }
  2194.     ST(0) = sv_newmortal();
  2195.     sv_setref_pv(ST(0), "POSIX::SigSet", (void*)RETVAL);
  2196.     }
  2197.     XSRETURN(1);
  2198. }
  2199.  
  2200. XS(XS_POSIX__SigSet_DESTROY)
  2201. {
  2202.     dXSARGS;
  2203.     if (items != 1) {
  2204.     croak("Usage: POSIX::SigSet::DESTROY(sigset)");
  2205.     }
  2206.     {
  2207.     POSIX__SigSet    sigset;
  2208.  
  2209.     if (SvROK(ST(0))) {
  2210.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2211.         sigset = (POSIX__SigSet) tmp;
  2212.     }
  2213.     else
  2214.         croak("sigset is not a reference");
  2215.     safefree((char *)sigset);
  2216.     }
  2217.     XSRETURN(1);
  2218. }
  2219.  
  2220. XS(XS_POSIX__SigSet_sigaddset)
  2221. {
  2222.     dXSARGS;
  2223.     if (items != 2) {
  2224.     croak("Usage: POSIX::SigSet::addset(sigset, sig)");
  2225.     }
  2226.     {
  2227.     POSIX__SigSet    sigset;
  2228.     int    sig = (int)SvIV(ST(1));
  2229.     SysRet    RETVAL;
  2230.  
  2231.     if (sv_isa(ST(0), "POSIX::SigSet")) {
  2232.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2233.         sigset = (POSIX__SigSet) tmp;
  2234.     }
  2235.     else
  2236.         croak("sigset is not of type POSIX::SigSet");
  2237.  
  2238.     RETVAL = sigaddset(sigset, sig);
  2239.     ST(0) = sv_newmortal();
  2240.     if (RETVAL != -1) {
  2241.         if (RETVAL == 0)
  2242.         sv_setpvn(ST(0), "0 but true", 10);
  2243.         else
  2244.         sv_setiv(ST(0), (IV)RETVAL);
  2245.     }
  2246.     }
  2247.     XSRETURN(1);
  2248. }
  2249.  
  2250. XS(XS_POSIX__SigSet_sigdelset)
  2251. {
  2252.     dXSARGS;
  2253.     if (items != 2) {
  2254.     croak("Usage: POSIX::SigSet::delset(sigset, sig)");
  2255.     }
  2256.     {
  2257.     POSIX__SigSet    sigset;
  2258.     int    sig = (int)SvIV(ST(1));
  2259.     SysRet    RETVAL;
  2260.  
  2261.     if (sv_isa(ST(0), "POSIX::SigSet")) {
  2262.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2263.         sigset = (POSIX__SigSet) tmp;
  2264.     }
  2265.     else
  2266.         croak("sigset is not of type POSIX::SigSet");
  2267.  
  2268.     RETVAL = sigdelset(sigset, sig);
  2269.     ST(0) = sv_newmortal();
  2270.     if (RETVAL != -1) {
  2271.         if (RETVAL == 0)
  2272.         sv_setpvn(ST(0), "0 but true", 10);
  2273.         else
  2274.         sv_setiv(ST(0), (IV)RETVAL);
  2275.     }
  2276.     }
  2277.     XSRETURN(1);
  2278. }
  2279.  
  2280. XS(XS_POSIX__SigSet_sigemptyset)
  2281. {
  2282.     dXSARGS;
  2283.     if (items != 1) {
  2284.     croak("Usage: POSIX::SigSet::emptyset(sigset)");
  2285.     }
  2286.     {
  2287.     POSIX__SigSet    sigset;
  2288.     SysRet    RETVAL;
  2289.  
  2290.     if (sv_isa(ST(0), "POSIX::SigSet")) {
  2291.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2292.         sigset = (POSIX__SigSet) tmp;
  2293.     }
  2294.     else
  2295.         croak("sigset is not of type POSIX::SigSet");
  2296.  
  2297.     RETVAL = sigemptyset(sigset);
  2298.     ST(0) = sv_newmortal();
  2299.     if (RETVAL != -1) {
  2300.         if (RETVAL == 0)
  2301.         sv_setpvn(ST(0), "0 but true", 10);
  2302.         else
  2303.         sv_setiv(ST(0), (IV)RETVAL);
  2304.     }
  2305.     }
  2306.     XSRETURN(1);
  2307. }
  2308.  
  2309. XS(XS_POSIX__SigSet_sigfillset)
  2310. {
  2311.     dXSARGS;
  2312.     if (items != 1) {
  2313.     croak("Usage: POSIX::SigSet::fillset(sigset)");
  2314.     }
  2315.     {
  2316.     POSIX__SigSet    sigset;
  2317.     SysRet    RETVAL;
  2318.  
  2319.     if (sv_isa(ST(0), "POSIX::SigSet")) {
  2320.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2321.         sigset = (POSIX__SigSet) tmp;
  2322.     }
  2323.     else
  2324.         croak("sigset is not of type POSIX::SigSet");
  2325.  
  2326.     RETVAL = sigfillset(sigset);
  2327.     ST(0) = sv_newmortal();
  2328.     if (RETVAL != -1) {
  2329.         if (RETVAL == 0)
  2330.         sv_setpvn(ST(0), "0 but true", 10);
  2331.         else
  2332.         sv_setiv(ST(0), (IV)RETVAL);
  2333.     }
  2334.     }
  2335.     XSRETURN(1);
  2336. }
  2337.  
  2338. XS(XS_POSIX__SigSet_sigismember)
  2339. {
  2340.     dXSARGS;
  2341.     if (items != 2) {
  2342.     croak("Usage: POSIX::SigSet::ismember(sigset, sig)");
  2343.     }
  2344.     {
  2345.     POSIX__SigSet    sigset;
  2346.     int    sig = (int)SvIV(ST(1));
  2347.     int    RETVAL;
  2348.  
  2349.     if (sv_isa(ST(0), "POSIX::SigSet")) {
  2350.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2351.         sigset = (POSIX__SigSet) tmp;
  2352.     }
  2353.     else
  2354.         croak("sigset is not of type POSIX::SigSet");
  2355.  
  2356.     RETVAL = sigismember(sigset, sig);
  2357.     ST(0) = sv_newmortal();
  2358.     sv_setiv(ST(0), (IV)RETVAL);
  2359.     }
  2360.     XSRETURN(1);
  2361. }
  2362.  
  2363. XS(XS_POSIX__Termios_new)
  2364. {
  2365.     dXSARGS;
  2366.     if (items < 0) {
  2367.     croak("Usage: POSIX::Termios::new(packname = \"POSIX::Termios\", ...)");
  2368.     }
  2369.     {
  2370.     char *    packname;
  2371.     POSIX__Termios    RETVAL;
  2372.  
  2373.     if (items < 1)
  2374.         packname = "POSIX::Termios";
  2375.     else {
  2376.         packname = (char *)SvPV(ST(0),na);
  2377.     }
  2378.     {
  2379. #ifdef I_TERMIOS
  2380.         RETVAL = (struct termios*)safemalloc(sizeof(struct termios));
  2381. #else
  2382.         not_here("termios");
  2383. #endif
  2384.     }
  2385.     ST(0) = sv_newmortal();
  2386.     sv_setref_pv(ST(0), "POSIX::Termios", (void*)RETVAL);
  2387.     }
  2388.     XSRETURN(1);
  2389. }
  2390.  
  2391. XS(XS_POSIX__Termios_DESTROY)
  2392. {
  2393.     dXSARGS;
  2394.     if (items != 1) {
  2395.     croak("Usage: POSIX::Termios::DESTROY(termios_ref)");
  2396.     }
  2397.     {
  2398.     POSIX__Termios    termios_ref;
  2399.  
  2400.     if (SvROK(ST(0))) {
  2401.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2402.         termios_ref = (POSIX__Termios) tmp;
  2403.     }
  2404.     else
  2405.         croak("termios_ref is not a reference");
  2406. #ifdef I_TERMIOS
  2407.     safefree((char *)termios_ref);
  2408. #else
  2409.         not_here("termios");
  2410. #endif
  2411.     }
  2412.     XSRETURN(1);
  2413. }
  2414.  
  2415. XS(XS_POSIX__Termios_getattr)
  2416. {
  2417.     dXSARGS;
  2418.     if (items < 1 || items > 2) {
  2419.     croak("Usage: POSIX::Termios::getattr(termios_ref, fd = 0)");
  2420.     }
  2421.     {
  2422.     POSIX__Termios    termios_ref;
  2423.     int    fd;
  2424.     SysRet    RETVAL;
  2425.  
  2426.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2427.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2428.         termios_ref = (POSIX__Termios) tmp;
  2429.     }
  2430.     else
  2431.         croak("termios_ref is not of type POSIX::Termios");
  2432.  
  2433.     if (items < 2)
  2434.         fd = 0;
  2435.     else {
  2436.         fd = (int)SvIV(ST(1));
  2437.     }
  2438.     RETVAL = tcgetattr(fd, termios_ref);
  2439.     ST(0) = sv_newmortal();
  2440.     if (RETVAL != -1) {
  2441.         if (RETVAL == 0)
  2442.         sv_setpvn(ST(0), "0 but true", 10);
  2443.         else
  2444.         sv_setiv(ST(0), (IV)RETVAL);
  2445.     }
  2446.     }
  2447.     XSRETURN(1);
  2448. }
  2449.  
  2450. XS(XS_POSIX__Termios_setattr)
  2451. {
  2452.     dXSARGS;
  2453.     if (items < 1 || items > 3) {
  2454.     croak("Usage: POSIX::Termios::setattr(termios_ref, fd = 0, optional_actions = 0)");
  2455.     }
  2456.     {
  2457.     POSIX__Termios    termios_ref;
  2458.     int    fd;
  2459.     int    optional_actions;
  2460.     SysRet    RETVAL;
  2461.  
  2462.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2463.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2464.         termios_ref = (POSIX__Termios) tmp;
  2465.     }
  2466.     else
  2467.         croak("termios_ref is not of type POSIX::Termios");
  2468.  
  2469.     if (items < 2)
  2470.         fd = 0;
  2471.     else {
  2472.         fd = (int)SvIV(ST(1));
  2473.     }
  2474.  
  2475.     if (items < 3)
  2476.         optional_actions = 0;
  2477.     else {
  2478.         optional_actions = (int)SvIV(ST(2));
  2479.     }
  2480.     RETVAL = tcsetattr(fd, optional_actions, termios_ref);
  2481.     ST(0) = sv_newmortal();
  2482.     if (RETVAL != -1) {
  2483.         if (RETVAL == 0)
  2484.         sv_setpvn(ST(0), "0 but true", 10);
  2485.         else
  2486.         sv_setiv(ST(0), (IV)RETVAL);
  2487.     }
  2488.     }
  2489.     XSRETURN(1);
  2490. }
  2491.  
  2492. XS(XS_POSIX__Termios_cfgetispeed)
  2493. {
  2494.     dXSARGS;
  2495.     if (items != 1) {
  2496.     croak("Usage: POSIX::Termios::getispeed(termios_ref)");
  2497.     }
  2498.     {
  2499.     POSIX__Termios    termios_ref;
  2500.     speed_t    RETVAL;
  2501.  
  2502.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2503.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2504.         termios_ref = (POSIX__Termios) tmp;
  2505.     }
  2506.     else
  2507.         croak("termios_ref is not of type POSIX::Termios");
  2508.  
  2509.     RETVAL = cfgetispeed(termios_ref);
  2510.     ST(0) = sv_newmortal();
  2511.     sv_setiv(ST(0), (IV)RETVAL);
  2512.     }
  2513.     XSRETURN(1);
  2514. }
  2515.  
  2516. XS(XS_POSIX__Termios_cfgetospeed)
  2517. {
  2518.     dXSARGS;
  2519.     if (items != 1) {
  2520.     croak("Usage: POSIX::Termios::getospeed(termios_ref)");
  2521.     }
  2522.     {
  2523.     POSIX__Termios    termios_ref;
  2524.     speed_t    RETVAL;
  2525.  
  2526.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2527.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2528.         termios_ref = (POSIX__Termios) tmp;
  2529.     }
  2530.     else
  2531.         croak("termios_ref is not of type POSIX::Termios");
  2532.  
  2533.     RETVAL = cfgetospeed(termios_ref);
  2534.     ST(0) = sv_newmortal();
  2535.     sv_setiv(ST(0), (IV)RETVAL);
  2536.     }
  2537.     XSRETURN(1);
  2538. }
  2539.  
  2540. XS(XS_POSIX__Termios_getiflag)
  2541. {
  2542.     dXSARGS;
  2543.     if (items != 1) {
  2544.     croak("Usage: POSIX::Termios::getiflag(termios_ref)");
  2545.     }
  2546.     {
  2547.     POSIX__Termios    termios_ref;
  2548.     tcflag_t    RETVAL;
  2549.  
  2550.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2551.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2552.         termios_ref = (POSIX__Termios) tmp;
  2553.     }
  2554.     else
  2555.         croak("termios_ref is not of type POSIX::Termios");
  2556. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2557.     RETVAL = termios_ref->c_iflag;
  2558. #else
  2559.         not_here("getiflag");
  2560. #endif
  2561.     ST(0) = sv_newmortal();
  2562.     sv_setiv(ST(0), (IV)RETVAL);
  2563.     }
  2564.     XSRETURN(1);
  2565. }
  2566.  
  2567. XS(XS_POSIX__Termios_getoflag)
  2568. {
  2569.     dXSARGS;
  2570.     if (items != 1) {
  2571.     croak("Usage: POSIX::Termios::getoflag(termios_ref)");
  2572.     }
  2573.     {
  2574.     POSIX__Termios    termios_ref;
  2575.     tcflag_t    RETVAL;
  2576.  
  2577.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2578.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2579.         termios_ref = (POSIX__Termios) tmp;
  2580.     }
  2581.     else
  2582.         croak("termios_ref is not of type POSIX::Termios");
  2583. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2584.     RETVAL = termios_ref->c_oflag;
  2585. #else
  2586.         not_here("getoflag");
  2587. #endif
  2588.     ST(0) = sv_newmortal();
  2589.     sv_setiv(ST(0), (IV)RETVAL);
  2590.     }
  2591.     XSRETURN(1);
  2592. }
  2593.  
  2594. XS(XS_POSIX__Termios_getcflag)
  2595. {
  2596.     dXSARGS;
  2597.     if (items != 1) {
  2598.     croak("Usage: POSIX::Termios::getcflag(termios_ref)");
  2599.     }
  2600.     {
  2601.     POSIX__Termios    termios_ref;
  2602.     tcflag_t    RETVAL;
  2603.  
  2604.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2605.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2606.         termios_ref = (POSIX__Termios) tmp;
  2607.     }
  2608.     else
  2609.         croak("termios_ref is not of type POSIX::Termios");
  2610. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2611.     RETVAL = termios_ref->c_cflag;
  2612. #else
  2613.         not_here("getcflag");
  2614. #endif
  2615.     ST(0) = sv_newmortal();
  2616.     sv_setiv(ST(0), (IV)RETVAL);
  2617.     }
  2618.     XSRETURN(1);
  2619. }
  2620.  
  2621. XS(XS_POSIX__Termios_getlflag)
  2622. {
  2623.     dXSARGS;
  2624.     if (items != 1) {
  2625.     croak("Usage: POSIX::Termios::getlflag(termios_ref)");
  2626.     }
  2627.     {
  2628.     POSIX__Termios    termios_ref;
  2629.     tcflag_t    RETVAL;
  2630.  
  2631.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2632.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2633.         termios_ref = (POSIX__Termios) tmp;
  2634.     }
  2635.     else
  2636.         croak("termios_ref is not of type POSIX::Termios");
  2637. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2638.     RETVAL = termios_ref->c_lflag;
  2639. #else
  2640.         not_here("getlflag");
  2641. #endif
  2642.     ST(0) = sv_newmortal();
  2643.     sv_setiv(ST(0), (IV)RETVAL);
  2644.     }
  2645.     XSRETURN(1);
  2646. }
  2647.  
  2648. XS(XS_POSIX__Termios_getcc)
  2649. {
  2650.     dXSARGS;
  2651.     if (items != 2) {
  2652.     croak("Usage: POSIX::Termios::getcc(termios_ref, ccix)");
  2653.     }
  2654.     {
  2655.     POSIX__Termios    termios_ref;
  2656.     int    ccix = (int)SvIV(ST(1));
  2657.     cc_t    RETVAL;
  2658.  
  2659.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2660.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2661.         termios_ref = (POSIX__Termios) tmp;
  2662.     }
  2663.     else
  2664.         croak("termios_ref is not of type POSIX::Termios");
  2665. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2666.     if (ccix >= NCCS)
  2667.         croak("Bad getcc subscript");
  2668.     RETVAL = termios_ref->c_cc[ccix];
  2669. #else
  2670.         not_here("getcc");
  2671. #endif
  2672.     ST(0) = sv_newmortal();
  2673.     sv_setiv(ST(0), (IV)RETVAL);
  2674.     }
  2675.     XSRETURN(1);
  2676. }
  2677.  
  2678. XS(XS_POSIX__Termios_cfsetispeed)
  2679. {
  2680.     dXSARGS;
  2681.     if (items != 2) {
  2682.     croak("Usage: POSIX::Termios::setispeed(termios_ref, speed)");
  2683.     }
  2684.     {
  2685.     POSIX__Termios    termios_ref;
  2686.     speed_t    speed = (speed_t)SvIV(ST(1));
  2687.     SysRet    RETVAL;
  2688.  
  2689.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2690.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2691.         termios_ref = (POSIX__Termios) tmp;
  2692.     }
  2693.     else
  2694.         croak("termios_ref is not of type POSIX::Termios");
  2695.  
  2696.     RETVAL = cfsetispeed(termios_ref, speed);
  2697.     ST(0) = sv_newmortal();
  2698.     if (RETVAL != -1) {
  2699.         if (RETVAL == 0)
  2700.         sv_setpvn(ST(0), "0 but true", 10);
  2701.         else
  2702.         sv_setiv(ST(0), (IV)RETVAL);
  2703.     }
  2704.     }
  2705.     XSRETURN(1);
  2706. }
  2707.  
  2708. XS(XS_POSIX__Termios_cfsetospeed)
  2709. {
  2710.     dXSARGS;
  2711.     if (items != 2) {
  2712.     croak("Usage: POSIX::Termios::setospeed(termios_ref, speed)");
  2713.     }
  2714.     {
  2715.     POSIX__Termios    termios_ref;
  2716.     speed_t    speed = (speed_t)SvIV(ST(1));
  2717.     SysRet    RETVAL;
  2718.  
  2719.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2720.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2721.         termios_ref = (POSIX__Termios) tmp;
  2722.     }
  2723.     else
  2724.         croak("termios_ref is not of type POSIX::Termios");
  2725.  
  2726.     RETVAL = cfsetospeed(termios_ref, speed);
  2727.     ST(0) = sv_newmortal();
  2728.     if (RETVAL != -1) {
  2729.         if (RETVAL == 0)
  2730.         sv_setpvn(ST(0), "0 but true", 10);
  2731.         else
  2732.         sv_setiv(ST(0), (IV)RETVAL);
  2733.     }
  2734.     }
  2735.     XSRETURN(1);
  2736. }
  2737.  
  2738. XS(XS_POSIX__Termios_setiflag)
  2739. {
  2740.     dXSARGS;
  2741.     if (items != 2) {
  2742.     croak("Usage: POSIX::Termios::setiflag(termios_ref, iflag)");
  2743.     }
  2744.     {
  2745.     POSIX__Termios    termios_ref;
  2746.     tcflag_t    iflag = (tcflag_t)SvIV(ST(1));
  2747.  
  2748.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2749.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2750.         termios_ref = (POSIX__Termios) tmp;
  2751.     }
  2752.     else
  2753.         croak("termios_ref is not of type POSIX::Termios");
  2754. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2755.     termios_ref->c_iflag = iflag;
  2756. #else
  2757.         not_here("setiflag");
  2758. #endif
  2759.     }
  2760.     XSRETURN(1);
  2761. }
  2762.  
  2763. XS(XS_POSIX__Termios_setoflag)
  2764. {
  2765.     dXSARGS;
  2766.     if (items != 2) {
  2767.     croak("Usage: POSIX::Termios::setoflag(termios_ref, oflag)");
  2768.     }
  2769.     {
  2770.     POSIX__Termios    termios_ref;
  2771.     tcflag_t    oflag = (tcflag_t)SvIV(ST(1));
  2772.  
  2773.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2774.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2775.         termios_ref = (POSIX__Termios) tmp;
  2776.     }
  2777.     else
  2778.         croak("termios_ref is not of type POSIX::Termios");
  2779. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2780.     termios_ref->c_oflag = oflag;
  2781. #else
  2782.         not_here("setoflag");
  2783. #endif
  2784.     }
  2785.     XSRETURN(1);
  2786. }
  2787.  
  2788. XS(XS_POSIX__Termios_setcflag)
  2789. {
  2790.     dXSARGS;
  2791.     if (items != 2) {
  2792.     croak("Usage: POSIX::Termios::setcflag(termios_ref, cflag)");
  2793.     }
  2794.     {
  2795.     POSIX__Termios    termios_ref;
  2796.     tcflag_t    cflag = (tcflag_t)SvIV(ST(1));
  2797.  
  2798.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2799.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2800.         termios_ref = (POSIX__Termios) tmp;
  2801.     }
  2802.     else
  2803.         croak("termios_ref is not of type POSIX::Termios");
  2804. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2805.     termios_ref->c_cflag = cflag;
  2806. #else
  2807.         not_here("setcflag");
  2808. #endif
  2809.     }
  2810.     XSRETURN(1);
  2811. }
  2812.  
  2813. XS(XS_POSIX__Termios_setlflag)
  2814. {
  2815.     dXSARGS;
  2816.     if (items != 2) {
  2817.     croak("Usage: POSIX::Termios::setlflag(termios_ref, lflag)");
  2818.     }
  2819.     {
  2820.     POSIX__Termios    termios_ref;
  2821.     tcflag_t    lflag = (tcflag_t)SvIV(ST(1));
  2822.  
  2823.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2824.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2825.         termios_ref = (POSIX__Termios) tmp;
  2826.     }
  2827.     else
  2828.         croak("termios_ref is not of type POSIX::Termios");
  2829. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2830.     termios_ref->c_lflag = lflag;
  2831. #else
  2832.         not_here("setlflag");
  2833. #endif
  2834.     }
  2835.     XSRETURN(1);
  2836. }
  2837.  
  2838. XS(XS_POSIX__Termios_setcc)
  2839. {
  2840.     dXSARGS;
  2841.     if (items != 3) {
  2842.     croak("Usage: POSIX::Termios::setcc(termios_ref, ccix, cc)");
  2843.     }
  2844.     {
  2845.     POSIX__Termios    termios_ref;
  2846.     int    ccix = (int)SvIV(ST(1));
  2847.     cc_t    cc = (cc_t)SvIV(ST(2));
  2848.  
  2849.     if (sv_isa(ST(0), "POSIX::Termios")) {
  2850.         IV tmp = SvIV((SV*)SvRV(ST(0)));
  2851.         termios_ref = (POSIX__Termios) tmp;
  2852.     }
  2853.     else
  2854.         croak("termios_ref is not of type POSIX::Termios");
  2855. #ifdef I_TERMIOS /* References a termios structure member so ifdef it out. */
  2856.     if (ccix >= NCCS)
  2857.         croak("Bad setcc subscript");
  2858.     termios_ref->c_cc[ccix] = cc;
  2859. #else
  2860.         not_here("setcc");
  2861. #endif
  2862.     }
  2863.     XSRETURN(1);
  2864. }
  2865.  
  2866. XS(XS_FileHandle_fgetpos)
  2867. {
  2868.     dXSARGS;
  2869.     if (items != 1) {
  2870.     croak("Usage: FileHandle::getpos(handle)");
  2871.     }
  2872.     {
  2873.     InputStream    handle = IoIFP(sv_2io(ST(0)));
  2874.     SV *    RETVAL;
  2875.     {
  2876.         Fpos_t pos;
  2877.         fgetpos(handle, &pos);
  2878.         ST(0) = sv_2mortal(newSVpv((char*)&pos, sizeof(Fpos_t)));
  2879.     }
  2880.     }
  2881.     XSRETURN(1);
  2882. }
  2883.  
  2884. XS(XS_FileHandle_fsetpos)
  2885. {
  2886.     dXSARGS;
  2887.     if (items != 2) {
  2888.     croak("Usage: FileHandle::setpos(handle, pos)");
  2889.     }
  2890.     {
  2891.     InputStream    handle = IoIFP(sv_2io(ST(0)));
  2892.     SV *    pos = ST(1);
  2893.     SysRet    RETVAL;
  2894.     RETVAL = fsetpos(handle, (Fpos_t*)SvPVX(pos));
  2895.     ST(0) = sv_newmortal();
  2896.     if (RETVAL != -1) {
  2897.         if (RETVAL == 0)
  2898.         sv_setpvn(ST(0), "0 but true", 10);
  2899.         else
  2900.         sv_setiv(ST(0), (IV)RETVAL);
  2901.     }
  2902.     }
  2903.     XSRETURN(1);
  2904. }
  2905.  
  2906. XS(XS_FileHandle_ungetc)
  2907. {
  2908.     dXSARGS;
  2909.     if (items != 2) {
  2910.     croak("Usage: FileHandle::ungetc(handle, c)");
  2911.     }
  2912.     {
  2913.     InputStream    handle = IoIFP(sv_2io(ST(0)));
  2914.     int    c = (int)SvIV(ST(1));
  2915.     int    RETVAL;
  2916.     RETVAL = ungetc(c, handle);
  2917.     ST(0) = sv_newmortal();
  2918.     sv_setiv(ST(0), (IV)RETVAL);
  2919.     }
  2920.     XSRETURN(1);
  2921. }
  2922.  
  2923. XS(XS_FileHandle_new_tmpfile)
  2924. {
  2925.     dXSARGS;
  2926.     if (items != 0) {
  2927.     croak("Usage: FileHandle::new_tmpfile()");
  2928.     }
  2929.     {
  2930.     OutputStream    RETVAL;
  2931.     RETVAL = tmpfile();
  2932.     ST(0) = sv_newmortal();
  2933.     {
  2934.         GV *gv = newGVgen("FileHandle");
  2935.         if ( do_open(gv, "+>&", 3, RETVAL) )
  2936.         sv_setsv(ST(0), sv_bless(newRV((SV*)gv), gv_stashpv("FileHandle",1)));
  2937.         else
  2938.         ST(0) = &sv_undef;
  2939.     }
  2940.     }
  2941.     XSRETURN(1);
  2942. }
  2943.  
  2944. XS(XS_FileHandle_ferror)
  2945. {
  2946.     dXSARGS;
  2947.     if (items != 1) {
  2948.     croak("Usage: FileHandle::error(handle)");
  2949.     }
  2950.     {
  2951.     InputStream    handle = IoIFP(sv_2io(ST(0)));
  2952.     int    RETVAL;
  2953.  
  2954.     RETVAL = ferror(handle);
  2955.     ST(0) = sv_newmortal();
  2956.     sv_setiv(ST(0), (IV)RETVAL);
  2957.     }
  2958.     XSRETURN(1);
  2959. }
  2960.  
  2961. XS(XS_FileHandle_fflush)
  2962. {
  2963.     dXSARGS;
  2964.     if (items != 1) {
  2965.     croak("Usage: FileHandle::flush(handle)");
  2966.     }
  2967.     {
  2968.     OutputStream    handle = IoOFP(sv_2io(ST(0)));
  2969.     SysRet    RETVAL;
  2970.  
  2971.     RETVAL = fflush(handle);
  2972.     ST(0) = sv_newmortal();
  2973.     if (RETVAL != -1) {
  2974.         if (RETVAL == 0)
  2975.         sv_setpvn(ST(0), "0 but true", 10);
  2976.         else
  2977.         sv_setiv(ST(0), (IV)RETVAL);
  2978.     }
  2979.     }
  2980.     XSRETURN(1);
  2981. }
  2982.  
  2983. XS(XS_FileHandle_setbuf)
  2984. {
  2985.     dXSARGS;
  2986.     if (items != 2) {
  2987.     croak("Usage: FileHandle::setbuf(handle, buf)");
  2988.     }
  2989.     {
  2990.     OutputStream    handle = IoOFP(sv_2io(ST(0)));
  2991.     char * buf = SvPOK(ST(1)) ? sv_grow(ST(1), BUFSIZ) : 0;
  2992.  
  2993.     setbuf(handle, buf);
  2994.     }
  2995.     XSRETURN(1);
  2996. }
  2997.  
  2998. XS(XS_FileHandle_setvbuf)
  2999. {
  3000.     dXSARGS;
  3001.     if (items != 4) {
  3002.     croak("Usage: FileHandle::setvbuf(handle, buf, type, size)");
  3003.     }
  3004.     {
  3005.     OutputStream    handle = IoOFP(sv_2io(ST(0)));
  3006.     char * buf = SvPOK(ST(1)) ? sv_grow(ST(1), SvIV(ST(3))) : 0;
  3007.     int    type = (int)SvIV(ST(2));
  3008.     int    size = (int)SvIV(ST(3));
  3009.     SysRet    RETVAL;
  3010.  
  3011.     RETVAL = setvbuf(handle, buf, type, size);
  3012.     ST(0) = sv_newmortal();
  3013.     if (RETVAL != -1) {
  3014.         if (RETVAL == 0)
  3015.         sv_setpvn(ST(0), "0 but true", 10);
  3016.         else
  3017.         sv_setiv(ST(0), (IV)RETVAL);
  3018.     }
  3019.     }
  3020.     XSRETURN(1);
  3021. }
  3022.  
  3023. XS(XS_POSIX_constant)
  3024. {
  3025.     dXSARGS;
  3026.     if (items != 2) {
  3027.     croak("Usage: POSIX::constant(name,arg)");
  3028.     }
  3029.     {
  3030.     char *    name = (char *)SvPV(ST(0),na);
  3031.     int    arg = (int)SvIV(ST(1));
  3032.     double    RETVAL;
  3033.  
  3034.     RETVAL = constant(name, arg);
  3035.     ST(0) = sv_newmortal();
  3036.     sv_setnv(ST(0), (double)RETVAL);
  3037.     }
  3038.     XSRETURN(1);
  3039. }
  3040.  
  3041. XS(XS_POSIX_isalnum)
  3042. {
  3043.     dXSARGS;
  3044.     if (items != 1) {
  3045.     croak("Usage: POSIX::isalnum(charstring)");
  3046.     }
  3047.     {
  3048.     char *    charstring = (char *)SvPV(ST(0),na);
  3049.     int    RETVAL;
  3050.     char *s;
  3051.     RETVAL = 1;
  3052.     for (s = charstring; *s && RETVAL; s++)
  3053.         if (!isalnum(*s))
  3054.         RETVAL = 0;
  3055.     ST(0) = sv_newmortal();
  3056.     sv_setiv(ST(0), (IV)RETVAL);
  3057.     }
  3058.     XSRETURN(1);
  3059. }
  3060.  
  3061. XS(XS_POSIX_isalpha)
  3062. {
  3063.     dXSARGS;
  3064.     if (items != 1) {
  3065.     croak("Usage: POSIX::isalpha(charstring)");
  3066.     }
  3067.     {
  3068.     char *    charstring = (char *)SvPV(ST(0),na);
  3069.     int    RETVAL;
  3070.     char *s;
  3071.     RETVAL = 1;
  3072.     for (s = charstring; *s && RETVAL; s++)
  3073.         if (!isalpha(*s))
  3074.         RETVAL = 0;
  3075.     ST(0) = sv_newmortal();
  3076.     sv_setiv(ST(0), (IV)RETVAL);
  3077.     }
  3078.     XSRETURN(1);
  3079. }
  3080.  
  3081. XS(XS_POSIX_iscntrl)
  3082. {
  3083.     dXSARGS;
  3084.     if (items != 1) {
  3085.     croak("Usage: POSIX::iscntrl(charstring)");
  3086.     }
  3087.     {
  3088.     char *    charstring = (char *)SvPV(ST(0),na);
  3089.     int    RETVAL;
  3090.     char *s;
  3091.     RETVAL = 1;
  3092.     for (s = charstring; *s && RETVAL; s++)
  3093.         if (!iscntrl(*s))
  3094.         RETVAL = 0;
  3095.     ST(0) = sv_newmortal();
  3096.     sv_setiv(ST(0), (IV)RETVAL);
  3097.     }
  3098.     XSRETURN(1);
  3099. }
  3100.  
  3101. XS(XS_POSIX_isdigit)
  3102. {
  3103.     dXSARGS;
  3104.     if (items != 1) {
  3105.     croak("Usage: POSIX::isdigit(charstring)");
  3106.     }
  3107.     {
  3108.     char *    charstring = (char *)SvPV(ST(0),na);
  3109.     int    RETVAL;
  3110.     char *s;
  3111.     RETVAL = 1;
  3112.     for (s = charstring; *s && RETVAL; s++)
  3113.         if (!isdigit(*s))
  3114.         RETVAL = 0;
  3115.     ST(0) = sv_newmortal();
  3116.     sv_setiv(ST(0), (IV)RETVAL);
  3117.     }
  3118.     XSRETURN(1);
  3119. }
  3120.  
  3121. XS(XS_POSIX_isgraph)
  3122. {
  3123.     dXSARGS;
  3124.     if (items != 1) {
  3125.     croak("Usage: POSIX::isgraph(charstring)");
  3126.     }
  3127.     {
  3128.     char *    charstring = (char *)SvPV(ST(0),na);
  3129.     int    RETVAL;
  3130.     char *s;
  3131.     RETVAL = 1;
  3132.     for (s = charstring; *s && RETVAL; s++)
  3133.         if (!isgraph(*s))
  3134.         RETVAL = 0;
  3135.     ST(0) = sv_newmortal();
  3136.     sv_setiv(ST(0), (IV)RETVAL);
  3137.     }
  3138.     XSRETURN(1);
  3139. }
  3140.  
  3141. XS(XS_POSIX_islower)
  3142. {
  3143.     dXSARGS;
  3144.     if (items != 1) {
  3145.     croak("Usage: POSIX::islower(charstring)");
  3146.     }
  3147.     {
  3148.     char *    charstring = (char *)SvPV(ST(0),na);
  3149.     int    RETVAL;
  3150.     char *s;
  3151.     RETVAL = 1;
  3152.     for (s = charstring; *s && RETVAL; s++)
  3153.         if (!islower(*s))
  3154.         RETVAL = 0;
  3155.     ST(0) = sv_newmortal();
  3156.     sv_setiv(ST(0), (IV)RETVAL);
  3157.     }
  3158.     XSRETURN(1);
  3159. }
  3160.  
  3161. XS(XS_POSIX_isprint)
  3162. {
  3163.     dXSARGS;
  3164.     if (items != 1) {
  3165.     croak("Usage: POSIX::isprint(charstring)");
  3166.     }
  3167.     {
  3168.     char *    charstring = (char *)SvPV(ST(0),na);
  3169.     int    RETVAL;
  3170.     char *s;
  3171.     RETVAL = 1;
  3172.     for (s = charstring; *s && RETVAL; s++)
  3173.         if (!isprint(*s))
  3174.         RETVAL = 0;
  3175.     ST(0) = sv_newmortal();
  3176.     sv_setiv(ST(0), (IV)RETVAL);
  3177.     }
  3178.     XSRETURN(1);
  3179. }
  3180.  
  3181. XS(XS_POSIX_ispunct)
  3182. {
  3183.     dXSARGS;
  3184.     if (items != 1) {
  3185.     croak("Usage: POSIX::ispunct(charstring)");
  3186.     }
  3187.     {
  3188.     char *    charstring = (char *)SvPV(ST(0),na);
  3189.     int    RETVAL;
  3190.     char *s;
  3191.     RETVAL = 1;
  3192.     for (s = charstring; *s && RETVAL; s++)
  3193.         if (!ispunct(*s))
  3194.         RETVAL = 0;
  3195.     ST(0) = sv_newmortal();
  3196.     sv_setiv(ST(0), (IV)RETVAL);
  3197.     }
  3198.     XSRETURN(1);
  3199. }
  3200.  
  3201. XS(XS_POSIX_isspace)
  3202. {
  3203.     dXSARGS;
  3204.     if (items != 1) {
  3205.     croak("Usage: POSIX::isspace(charstring)");
  3206.     }
  3207.     {
  3208.     char *    charstring = (char *)SvPV(ST(0),na);
  3209.     int    RETVAL;
  3210.     char *s;
  3211.     RETVAL = 1;
  3212.     for (s = charstring; *s && RETVAL; s++)
  3213.         if (!isspace(*s))
  3214.         RETVAL = 0;
  3215.     ST(0) = sv_newmortal();
  3216.     sv_setiv(ST(0), (IV)RETVAL);
  3217.     }
  3218.     XSRETURN(1);
  3219. }
  3220.  
  3221. XS(XS_POSIX_isupper)
  3222. {
  3223.     dXSARGS;
  3224.     if (items != 1) {
  3225.     croak("Usage: POSIX::isupper(charstring)");
  3226.     }
  3227.     {
  3228.     char *    charstring = (char *)SvPV(ST(0),na);
  3229.     int    RETVAL;
  3230.     char *s;
  3231.     RETVAL = 1;
  3232.     for (s = charstring; *s && RETVAL; s++)
  3233.         if (!isupper(*s))
  3234.         RETVAL = 0;
  3235.     ST(0) = sv_newmortal();
  3236.     sv_setiv(ST(0), (IV)RETVAL);
  3237.     }
  3238.     XSRETURN(1);
  3239. }
  3240.  
  3241. XS(XS_POSIX_isxdigit)
  3242. {
  3243.     dXSARGS;
  3244.     if (items != 1) {
  3245.     croak("Usage: POSIX::isxdigit(charstring)");
  3246.     }
  3247.     {
  3248.     char *    charstring = (char *)SvPV(ST(0),na);
  3249.     int    RETVAL;
  3250.     char *s;
  3251.     RETVAL = 1;
  3252.     for (s = charstring; *s && RETVAL; s++)
  3253.         if (!isxdigit(*s))
  3254.         RETVAL = 0;
  3255.     ST(0) = sv_newmortal();
  3256.     sv_setiv(ST(0), (IV)RETVAL);
  3257.     }
  3258.     XSRETURN(1);
  3259. }
  3260.  
  3261. XS(XS_POSIX_open)
  3262. {
  3263.     dXSARGS;
  3264.     if (items < 1 || items > 3) {
  3265.     croak("Usage: POSIX::open(filename, flags = O_RDONLY, mode = 0666)");
  3266.     }
  3267.     {
  3268.     char *    filename = (char *)SvPV(ST(0),na);
  3269.     int    flags;
  3270.     Mode_t    mode;
  3271.     SysRet    RETVAL;
  3272.  
  3273.     if (items < 2)
  3274.         flags = O_RDONLY;
  3275.     else {
  3276.         flags = (int)SvIV(ST(1));
  3277.     }
  3278.  
  3279.     if (items < 3)
  3280.         mode = 0666;
  3281.     else {
  3282.         mode = (Mode_t)SvNV(ST(2));
  3283.     }
  3284.  
  3285.     RETVAL = open(filename, flags, mode);
  3286.     ST(0) = sv_newmortal();
  3287.     if (RETVAL != -1) {
  3288.         if (RETVAL == 0)
  3289.         sv_setpvn(ST(0), "0 but true", 10);
  3290.         else
  3291.         sv_setiv(ST(0), (IV)RETVAL);
  3292.     }
  3293.     }
  3294.     XSRETURN(1);
  3295. }
  3296.  
  3297. XS(XS_POSIX_localeconv)
  3298. {
  3299.     dXSARGS;
  3300.     if (items != 0) {
  3301.     croak("Usage: POSIX::localeconv()");
  3302.     }
  3303.     {
  3304.     HV *    RETVAL;
  3305. #ifdef HAS_LOCALECONV
  3306.     struct lconv *lcbuf;
  3307.     RETVAL = newHV();
  3308.     if (lcbuf = localeconv()) {
  3309.         /* the strings */
  3310.         if (lcbuf->decimal_point && *lcbuf->decimal_point)
  3311.         hv_store(RETVAL, "decimal_point", 13,
  3312.             newSVpv(lcbuf->decimal_point, 0), 0);
  3313.         if (lcbuf->thousands_sep && *lcbuf->thousands_sep)
  3314.         hv_store(RETVAL, "thousands_sep", 13,
  3315.             newSVpv(lcbuf->thousands_sep, 0), 0);
  3316.         if (lcbuf->grouping && *lcbuf->grouping)
  3317.         hv_store(RETVAL, "grouping", 8,
  3318.             newSVpv(lcbuf->grouping, 0), 0);
  3319.         if (lcbuf->int_curr_symbol && *lcbuf->int_curr_symbol)
  3320.         hv_store(RETVAL, "int_curr_symbol", 15,
  3321.             newSVpv(lcbuf->int_curr_symbol, 0), 0);
  3322.         if (lcbuf->currency_symbol && *lcbuf->currency_symbol)
  3323.         hv_store(RETVAL, "currency_symbol", 15,
  3324.             newSVpv(lcbuf->currency_symbol, 0), 0);
  3325.         if (lcbuf->mon_decimal_point && *lcbuf->mon_decimal_point)
  3326.         hv_store(RETVAL, "mon_decimal_point", 17,
  3327.             newSVpv(lcbuf->mon_decimal_point, 0), 0);
  3328.         if (lcbuf->mon_thousands_sep && *lcbuf->mon_thousands_sep)
  3329.         hv_store(RETVAL, "mon_thousands_sep", 17,
  3330.             newSVpv(lcbuf->mon_thousands_sep, 0), 0);
  3331.         if (lcbuf->mon_grouping && *lcbuf->mon_grouping)
  3332.         hv_store(RETVAL, "mon_grouping", 12,
  3333.             newSVpv(lcbuf->mon_grouping, 0), 0);
  3334.         if (lcbuf->positive_sign && *lcbuf->positive_sign)
  3335.         hv_store(RETVAL, "positive_sign", 13,
  3336.             newSVpv(lcbuf->positive_sign, 0), 0);
  3337.         if (lcbuf->negative_sign && *lcbuf->negative_sign)
  3338.         hv_store(RETVAL, "negative_sign", 13,
  3339.             newSVpv(lcbuf->negative_sign, 0), 0);
  3340.         /* the integers */
  3341.         if (lcbuf->int_frac_digits != CHAR_MAX)
  3342.         hv_store(RETVAL, "int_frac_digits", 15,
  3343.             newSViv(lcbuf->int_frac_digits), 0);
  3344.         if (lcbuf->frac_digits != CHAR_MAX)
  3345.         hv_store(RETVAL, "frac_digits", 11,
  3346.             newSViv(lcbuf->frac_digits), 0);
  3347.         if (lcbuf->p_cs_precedes != CHAR_MAX)
  3348.         hv_store(RETVAL, "p_cs_precedes", 13,
  3349.             newSViv(lcbuf->p_cs_precedes), 0);
  3350.         if (lcbuf->p_sep_by_space != CHAR_MAX)
  3351.         hv_store(RETVAL, "p_sep_by_space", 14,
  3352.             newSViv(lcbuf->p_sep_by_space), 0);
  3353.         if (lcbuf->n_cs_precedes != CHAR_MAX)
  3354.         hv_store(RETVAL, "n_cs_precedes", 13,
  3355.             newSViv(lcbuf->n_cs_precedes), 0);
  3356.         if (lcbuf->n_sep_by_space != CHAR_MAX)
  3357.         hv_store(RETVAL, "n_sep_by_space", 14,
  3358.             newSViv(lcbuf->n_sep_by_space), 0);
  3359.         if (lcbuf->p_sign_posn != CHAR_MAX)
  3360.         hv_store(RETVAL, "p_sign_posn", 11,
  3361.             newSViv(lcbuf->p_sign_posn), 0);
  3362.         if (lcbuf->n_sign_posn != CHAR_MAX)
  3363.         hv_store(RETVAL, "n_sign_posn", 11,
  3364.             newSViv(lcbuf->n_sign_posn), 0);
  3365.     }
  3366. #else
  3367.     localeconv(); /* A stub to call not_here(). */
  3368. #endif
  3369.     ST(0) = newRV((SV*)RETVAL);
  3370.     sv_2mortal(ST(0));
  3371.     }
  3372.     XSRETURN(1);
  3373. }
  3374.  
  3375. XS(XS_POSIX_setlocale)
  3376. {
  3377.     dXSARGS;
  3378.     if (items != 2) {
  3379.     croak("Usage: POSIX::setlocale(category, locale)");
  3380.     }
  3381.     {
  3382.     int    category = (int)SvIV(ST(0));
  3383.     char *    locale = (char *)SvPV(ST(1),na);
  3384.     char *    RETVAL;
  3385.  
  3386.     RETVAL = setlocale(category, locale);
  3387.     ST(0) = sv_newmortal();
  3388.     sv_setpv((SV*)ST(0), RETVAL);
  3389.     }
  3390.     XSRETURN(1);
  3391. }
  3392.  
  3393. XS(XS_POSIX_acos)
  3394. {
  3395.     dXSARGS;
  3396.     if (items != 1) {
  3397.     croak("Usage: POSIX::acos(x)");
  3398.     }
  3399.     {
  3400.     double    x = (double)SvNV(ST(0));
  3401.     double    RETVAL;
  3402.  
  3403.     RETVAL = acos(x);
  3404.     ST(0) = sv_newmortal();
  3405.     sv_setnv(ST(0), (double)RETVAL);
  3406.     }
  3407.     XSRETURN(1);
  3408. }
  3409.  
  3410. XS(XS_POSIX_asin)
  3411. {
  3412.     dXSARGS;
  3413.     if (items != 1) {
  3414.     croak("Usage: POSIX::asin(x)");
  3415.     }
  3416.     {
  3417.     double    x = (double)SvNV(ST(0));
  3418.     double    RETVAL;
  3419.  
  3420.     RETVAL = asin(x);
  3421.     ST(0) = sv_newmortal();
  3422.     sv_setnv(ST(0), (double)RETVAL);
  3423.     }
  3424.     XSRETURN(1);
  3425. }
  3426.  
  3427. XS(XS_POSIX_atan)
  3428. {
  3429.     dXSARGS;
  3430.     if (items != 1) {
  3431.     croak("Usage: POSIX::atan(x)");
  3432.     }
  3433.     {
  3434.     double    x = (double)SvNV(ST(0));
  3435.     double    RETVAL;
  3436.  
  3437.     RETVAL = atan(x);
  3438.     ST(0) = sv_newmortal();
  3439.     sv_setnv(ST(0), (double)RETVAL);
  3440.     }
  3441.     XSRETURN(1);
  3442. }
  3443.  
  3444. XS(XS_POSIX_ceil)
  3445. {
  3446.     dXSARGS;
  3447.     if (items != 1) {
  3448.     croak("Usage: POSIX::ceil(x)");
  3449.     }
  3450.     {
  3451.     double    x = (double)SvNV(ST(0));
  3452.     double    RETVAL;
  3453.  
  3454.     RETVAL = ceil(x);
  3455.     ST(0) = sv_newmortal();
  3456.     sv_setnv(ST(0), (double)RETVAL);
  3457.     }
  3458.     XSRETURN(1);
  3459. }
  3460.  
  3461. XS(XS_POSIX_cosh)
  3462. {
  3463.     dXSARGS;
  3464.     if (items != 1) {
  3465.     croak("Usage: POSIX::cosh(x)");
  3466.     }
  3467.     {
  3468.     double    x = (double)SvNV(ST(0));
  3469.     double    RETVAL;
  3470.  
  3471.     RETVAL = cosh(x);
  3472.     ST(0) = sv_newmortal();
  3473.     sv_setnv(ST(0), (double)RETVAL);
  3474.     }
  3475.     XSRETURN(1);
  3476. }
  3477.  
  3478. XS(XS_POSIX_floor)
  3479. {
  3480.     dXSARGS;
  3481.     if (items != 1) {
  3482.     croak("Usage: POSIX::floor(x)");
  3483.     }
  3484.     {
  3485.     double    x = (double)SvNV(ST(0));
  3486.     double    RETVAL;
  3487.  
  3488.     RETVAL = floor(x);
  3489.     ST(0) = sv_newmortal();
  3490.     sv_setnv(ST(0), (double)RETVAL);
  3491.     }
  3492.     XSRETURN(1);
  3493. }
  3494.  
  3495. XS(XS_POSIX_fmod)
  3496. {
  3497.     dXSARGS;
  3498.     if (items != 2) {
  3499.     croak("Usage: POSIX::fmod(x,y)");
  3500.     }
  3501.     {
  3502.     double    x = (double)SvNV(ST(0));
  3503.     double    y = (double)SvNV(ST(1));
  3504.     double    RETVAL;
  3505.  
  3506.     RETVAL = fmod(x, y);
  3507.     ST(0) = sv_newmortal();
  3508.     sv_setnv(ST(0), (double)RETVAL);
  3509.     }
  3510.     XSRETURN(1);
  3511. }
  3512.  
  3513. XS(XS_POSIX_frexp)
  3514. {
  3515.     dXSARGS;
  3516.     if (items != 1) {
  3517.     croak("Usage: POSIX::frexp(x)");
  3518.     }
  3519.     SP -= items;
  3520.     {
  3521.     double    x = (double)SvNV(ST(0));
  3522.     int expvar;
  3523.     /* (We already know stack is long enough.) */
  3524.     PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
  3525.     PUSHs(sv_2mortal(newSViv(expvar)));
  3526.     PUTBACK;
  3527.     return;
  3528.     }
  3529. }
  3530.  
  3531. XS(XS_POSIX_ldexp)
  3532. {
  3533.     dXSARGS;
  3534.     if (items != 2) {
  3535.     croak("Usage: POSIX::ldexp(x,exp)");
  3536.     }
  3537.     {
  3538.     double    x = (double)SvNV(ST(0));
  3539.     int    exp = (int)SvIV(ST(1));
  3540.     double    RETVAL;
  3541.  
  3542.     RETVAL = ldexp(x, exp);
  3543.     ST(0) = sv_newmortal();
  3544.     sv_setnv(ST(0), (double)RETVAL);
  3545.     }
  3546.     XSRETURN(1);
  3547. }
  3548.  
  3549. XS(XS_POSIX_log10)
  3550. {
  3551.     dXSARGS;
  3552.     if (items != 1) {
  3553.     croak("Usage: POSIX::log10(x)");
  3554.     }
  3555.     {
  3556.     double    x = (double)SvNV(ST(0));
  3557.     double    RETVAL;
  3558.  
  3559.     RETVAL = log10(x);
  3560.     ST(0) = sv_newmortal();
  3561.     sv_setnv(ST(0), (double)RETVAL);
  3562.     }
  3563.     XSRETURN(1);
  3564. }
  3565.  
  3566. XS(XS_POSIX_modf)
  3567. {
  3568.     dXSARGS;
  3569.     if (items != 1) {
  3570.     croak("Usage: POSIX::modf(x)");
  3571.     }
  3572.     SP -= items;
  3573.     {
  3574.     double    x = (double)SvNV(ST(0));
  3575.     double intvar;
  3576.     /* (We already know stack is long enough.) */
  3577.     PUSHs(sv_2mortal(newSVnv(modf(x,&intvar))));
  3578.     PUSHs(sv_2mortal(newSVnv(intvar)));
  3579.     PUTBACK;
  3580.     return;
  3581.     }
  3582. }
  3583.  
  3584. XS(XS_POSIX_sinh)
  3585. {
  3586.     dXSARGS;
  3587.     if (items != 1) {
  3588.     croak("Usage: POSIX::sinh(x)");
  3589.     }
  3590.     {
  3591.     double    x = (double)SvNV(ST(0));
  3592.     double    RETVAL;
  3593.  
  3594.     RETVAL = sinh(x);
  3595.     ST(0) = sv_newmortal();
  3596.     sv_setnv(ST(0), (double)RETVAL);
  3597.     }
  3598.     XSRETURN(1);
  3599. }
  3600.  
  3601. XS(XS_POSIX_tanh)
  3602. {
  3603.     dXSARGS;
  3604.     if (items != 1) {
  3605.     croak("Usage: POSIX::tanh(x)");
  3606.     }
  3607.     {
  3608.     double    x = (double)SvNV(ST(0));
  3609.     double    RETVAL;
  3610.  
  3611.     RETVAL = tanh(x);
  3612.     ST(0) = sv_newmortal();
  3613.     sv_setnv(ST(0), (double)RETVAL);
  3614.     }
  3615.     XSRETURN(1);
  3616. }
  3617.  
  3618. XS(XS_POSIX_close)
  3619. {
  3620.     dXSARGS;
  3621.     if (items != 1) {
  3622.     croak("Usage: POSIX::close(fd)");
  3623.     }
  3624.     {
  3625.     int    fd = (int)SvIV(ST(0));
  3626.     SysRet    RETVAL;
  3627.  
  3628.     RETVAL = close(fd);
  3629.     ST(0) = sv_newmortal();
  3630.     if (RETVAL != -1) {
  3631.         if (RETVAL == 0)
  3632.         sv_setpvn(ST(0), "0 but true", 10);
  3633.         else
  3634.         sv_setiv(ST(0), (IV)RETVAL);
  3635.     }
  3636.     }
  3637.     XSRETURN(1);
  3638. }
  3639.  
  3640. XS(XS_POSIX_dup)
  3641. {
  3642.     dXSARGS;
  3643.     if (items != 1) {
  3644.     croak("Usage: POSIX::dup(fd)");
  3645.     }
  3646.     {
  3647.     int    fd = (int)SvIV(ST(0));
  3648.     SysRet    RETVAL;
  3649.  
  3650.     RETVAL = dup(fd);
  3651.     ST(0) = sv_newmortal();
  3652.     if (RETVAL != -1) {
  3653.         if (RETVAL == 0)
  3654.         sv_setpvn(ST(0), "0 but true", 10);
  3655.         else
  3656.         sv_setiv(ST(0), (IV)RETVAL);
  3657.     }
  3658.     }
  3659.     XSRETURN(1);
  3660. }
  3661.  
  3662. XS(XS_POSIX_dup2)
  3663. {
  3664.     dXSARGS;
  3665.     if (items != 2) {
  3666.     croak("Usage: POSIX::dup2(fd1, fd2)");
  3667.     }
  3668.     {
  3669.     int    fd1 = (int)SvIV(ST(0));
  3670.     int    fd2 = (int)SvIV(ST(1));
  3671.     SysRet    RETVAL;
  3672.  
  3673.     RETVAL = dup2(fd1, fd2);
  3674.     ST(0) = sv_newmortal();
  3675.     if (RETVAL != -1) {
  3676.         if (RETVAL == 0)
  3677.         sv_setpvn(ST(0), "0 but true", 10);
  3678.         else
  3679.         sv_setiv(ST(0), (IV)RETVAL);
  3680.     }
  3681.     }
  3682.     XSRETURN(1);
  3683. }
  3684.  
  3685. XS(XS_POSIX_lseek)
  3686. {
  3687.     dXSARGS;
  3688.     if (items != 3) {
  3689.     croak("Usage: POSIX::lseek(fd, offset, whence)");
  3690.     }
  3691.     {
  3692.     int    fd = (int)SvIV(ST(0));
  3693.     Off_t    offset = (Off_t)SvNV(ST(1));
  3694.     int    whence = (int)SvIV(ST(2));
  3695.     SysRet    RETVAL;
  3696.  
  3697.     RETVAL = lseek(fd, offset, whence);
  3698.     ST(0) = sv_newmortal();
  3699.     if (RETVAL != -1) {
  3700.         if (RETVAL == 0)
  3701.         sv_setpvn(ST(0), "0 but true", 10);
  3702.         else
  3703.         sv_setiv(ST(0), (IV)RETVAL);
  3704.     }
  3705.     }
  3706.     XSRETURN(1);
  3707. }
  3708.  
  3709. XS(XS_POSIX_nice)
  3710. {
  3711.     dXSARGS;
  3712.     if (items != 1) {
  3713.     croak("Usage: POSIX::nice(incr)");
  3714.     }
  3715.     {
  3716.     int    incr = (int)SvIV(ST(0));
  3717.     SysRet    RETVAL;
  3718.  
  3719.     RETVAL = nice(incr);
  3720.     ST(0) = sv_newmortal();
  3721.     if (RETVAL != -1) {
  3722.         if (RETVAL == 0)
  3723.         sv_setpvn(ST(0), "0 but true", 10);
  3724.         else
  3725.         sv_setiv(ST(0), (IV)RETVAL);
  3726.     }
  3727.     }
  3728.     XSRETURN(1);
  3729. }
  3730.  
  3731. XS(XS_POSIX_pipe)
  3732. {
  3733.     dXSARGS;
  3734.     if (items != 0) {
  3735.     croak("Usage: POSIX::pipe()");
  3736.     }
  3737.     SP -= items;
  3738.     {
  3739.     int    RETVAL;
  3740.     int fds[2];
  3741.     if (pipe(fds) != -1) {
  3742.         EXTEND(sp,2);
  3743.         PUSHs(sv_2mortal(newSViv(fds[0])));
  3744.         PUSHs(sv_2mortal(newSViv(fds[1])));
  3745.     }
  3746.     PUTBACK;
  3747.     return;
  3748.     }
  3749. }
  3750.  
  3751. XS(XS_POSIX_read)
  3752. {
  3753.     dXSARGS;
  3754.     if (items != 3) {
  3755.     croak("Usage: POSIX::read(fd, buffer, nbytes)");
  3756.     }
  3757.     {
  3758.     int    fd = (int)SvIV(ST(0));
  3759.     char * buffer = sv_grow(ST(1),SvIV(ST(2))+1);
  3760.     size_t    nbytes = (size_t)SvIV(ST(2));
  3761.     SysRet    RETVAL;
  3762.  
  3763.     RETVAL = read(fd, buffer, nbytes);
  3764.     ST(0) = sv_newmortal();
  3765.     if (RETVAL != -1) {
  3766.         if (RETVAL == 0)
  3767.         sv_setpvn(ST(0), "0 but true", 10);
  3768.         else
  3769.         sv_setiv(ST(0), (IV)RETVAL);
  3770.     }
  3771.     if (RETVAL >= 0) {
  3772.         SvCUR(ST(1)) = RETVAL;
  3773.         SvPOK_only(ST(1));
  3774.         *SvEND(ST(1)) = '\0';
  3775.         if (tainting)
  3776.         sv_magic(ST(1), 0, 't', 0, 0);
  3777.     }
  3778.     }
  3779.     XSRETURN(1);
  3780. }
  3781.  
  3782. XS(XS_POSIX_setgid)
  3783. {
  3784.     dXSARGS;
  3785.     if (items != 1) {
  3786.     croak("Usage: POSIX::setgid(gid)");
  3787.     }
  3788.     {
  3789.     Gid_t    gid = (Gid_t)SvNV(ST(0));
  3790.     SysRet    RETVAL;
  3791.  
  3792.     RETVAL = setgid(gid);
  3793.     ST(0) = sv_newmortal();
  3794.     if (RETVAL != -1) {
  3795.         if (RETVAL == 0)
  3796.         sv_setpvn(ST(0), "0 but true", 10);
  3797.         else
  3798.         sv_setiv(ST(0), (IV)RETVAL);
  3799.     }
  3800.     }
  3801.     XSRETURN(1);
  3802. }
  3803.  
  3804. XS(XS_POSIX_setpgid)
  3805. {
  3806.     dXSARGS;
  3807.     if (items != 2) {
  3808.     croak("Usage: POSIX::setpgid(pid, pgid)");
  3809.     }
  3810.     {
  3811.     pid_t    pid = (pid_t)SvNV(ST(0));
  3812.     pid_t    pgid = (pid_t)SvNV(ST(1));
  3813.     SysRet    RETVAL;
  3814.  
  3815.     RETVAL = setpgid(pid, pgid);
  3816.     ST(0) = sv_newmortal();
  3817.     if (RETVAL != -1) {
  3818.         if (RETVAL == 0)
  3819.         sv_setpvn(ST(0), "0 but true", 10);
  3820.         else
  3821.         sv_setiv(ST(0), (IV)RETVAL);
  3822.     }
  3823.     }
  3824.     XSRETURN(1);
  3825. }
  3826.  
  3827. XS(XS_POSIX_setsid)
  3828. {
  3829.     dXSARGS;
  3830.     if (items != 0) {
  3831.     croak("Usage: POSIX::setsid()");
  3832.     }
  3833.     {
  3834.     pid_t    RETVAL;
  3835.  
  3836.     RETVAL = setsid();
  3837.     ST(0) = sv_newmortal();
  3838.     sv_setnv(ST(0), (double)RETVAL);
  3839.     }
  3840.     XSRETURN(1);
  3841. }
  3842.  
  3843. XS(XS_POSIX_setuid)
  3844. {
  3845.     dXSARGS;
  3846.     if (items != 1) {
  3847.     croak("Usage: POSIX::setuid(uid)");
  3848.     }
  3849.     {
  3850.     Uid_t    uid = (Uid_t)SvNV(ST(0));
  3851.     SysRet    RETVAL;
  3852.  
  3853.     RETVAL = setuid(uid);
  3854.     ST(0) = sv_newmortal();
  3855.     if (RETVAL != -1) {
  3856.         if (RETVAL == 0)
  3857.         sv_setpvn(ST(0), "0 but true", 10);
  3858.         else
  3859.         sv_setiv(ST(0), (IV)RETVAL);
  3860.     }
  3861.     }
  3862.     XSRETURN(1);
  3863. }
  3864.  
  3865. XS(XS_POSIX_tcgetpgrp)
  3866. {
  3867.     dXSARGS;
  3868.     if (items != 1) {
  3869.     croak("Usage: POSIX::tcgetpgrp(fd)");
  3870.     }
  3871.     {
  3872.     int    fd = (int)SvIV(ST(0));
  3873.     pid_t    RETVAL;
  3874.  
  3875.     RETVAL = tcgetpgrp(fd);
  3876.     ST(0) = sv_newmortal();
  3877.     sv_setnv(ST(0), (double)RETVAL);
  3878.     }
  3879.     XSRETURN(1);
  3880. }
  3881.  
  3882. XS(XS_POSIX_tcsetpgrp)
  3883. {
  3884.     dXSARGS;
  3885.     if (items != 2) {
  3886.     croak("Usage: POSIX::tcsetpgrp(fd, pgrp_id)");
  3887.     }
  3888.     {
  3889.     int    fd = (int)SvIV(ST(0));
  3890.     pid_t    pgrp_id = (pid_t)SvNV(ST(1));
  3891.     SysRet    RETVAL;
  3892.  
  3893.     RETVAL = tcsetpgrp(fd, pgrp_id);
  3894.     ST(0) = sv_newmortal();
  3895.     if (RETVAL != -1) {
  3896.         if (RETVAL == 0)
  3897.         sv_setpvn(ST(0), "0 but true", 10);
  3898.         else
  3899.         sv_setiv(ST(0), (IV)RETVAL);
  3900.     }
  3901.     }
  3902.     XSRETURN(1);
  3903. }
  3904.  
  3905. XS(XS_POSIX_uname)
  3906. {
  3907.     dXSARGS;
  3908.     if (items != 0) {
  3909.     croak("Usage: POSIX::uname()");
  3910.     }
  3911.     SP -= items;
  3912.     {
  3913.     int    RETVAL;
  3914. #ifdef HAS_UNAME
  3915.     struct utsname buf;
  3916.     if (uname(&buf) >= 0) {
  3917.         EXTEND(sp, 5);
  3918.         PUSHs(sv_2mortal(newSVpv(buf.sysname, 0)));
  3919.         PUSHs(sv_2mortal(newSVpv(buf.nodename, 0)));
  3920.         PUSHs(sv_2mortal(newSVpv(buf.release, 0)));
  3921.         PUSHs(sv_2mortal(newSVpv(buf.version, 0)));
  3922.         PUSHs(sv_2mortal(newSVpv(buf.machine, 0)));
  3923.     }
  3924. #else
  3925.     uname((char *) 0); /* A stub to call not_here(). */
  3926. #endif
  3927.     PUTBACK;
  3928.     return;
  3929.     }
  3930. }
  3931.  
  3932. XS(XS_POSIX_write)
  3933. {
  3934.     dXSARGS;
  3935.     if (items != 3) {
  3936.     croak("Usage: POSIX::write(fd, buffer, nbytes)");
  3937.     }
  3938.     {
  3939.     int    fd = (int)SvIV(ST(0));
  3940.     char *    buffer = (char *)SvPV(ST(1),na);
  3941.     size_t    nbytes = (size_t)SvIV(ST(2));
  3942.     SysRet    RETVAL;
  3943.  
  3944.     RETVAL = write(fd, buffer, nbytes);
  3945.     ST(0) = sv_newmortal();
  3946.     if (RETVAL != -1) {
  3947.         if (RETVAL == 0)
  3948.         sv_setpvn(ST(0), "0 but true", 10);
  3949.         else
  3950.         sv_setiv(ST(0), (IV)RETVAL);
  3951.     }
  3952.     }
  3953.     XSRETURN(1);
  3954. }
  3955.  
  3956. XS(XS_POSIX_tmpnam)
  3957. {
  3958.     dXSARGS;
  3959.     if (items < 0 || items > 1) {
  3960.     croak("Usage: POSIX::tmpnam(s = 0)");
  3961.     }
  3962.     {
  3963.     char * s = 0;
  3964.     char *    RETVAL;
  3965.  
  3966.     RETVAL = tmpnam(s);
  3967.     ST(0) = sv_newmortal();
  3968.     sv_setpv((SV*)ST(0), RETVAL);
  3969.     }
  3970.     XSRETURN(1);
  3971. }
  3972.  
  3973. XS(XS_POSIX_abort)
  3974. {
  3975.     dXSARGS;
  3976.     if (items != 0) {
  3977.     croak("Usage: POSIX::abort()");
  3978.     }
  3979.     {
  3980.  
  3981.     abort();
  3982.     }
  3983.     XSRETURN(1);
  3984. }
  3985.  
  3986. XS(XS_POSIX_mblen)
  3987. {
  3988.     dXSARGS;
  3989.     if (items != 2) {
  3990.     croak("Usage: POSIX::mblen(s, n)");
  3991.     }
  3992.     {
  3993.     char *    s = (char *)SvPV(ST(0),na);
  3994.     size_t    n = (size_t)SvIV(ST(1));
  3995.     int    RETVAL;
  3996.  
  3997.     RETVAL = mblen(s, n);
  3998.     ST(0) = sv_newmortal();
  3999.     sv_setiv(ST(0), (IV)RETVAL);
  4000.     }
  4001.     XSRETURN(1);
  4002. }
  4003.  
  4004. XS(XS_POSIX_mbstowcs)
  4005. {
  4006.     dXSARGS;
  4007.     if (items != 3) {
  4008.     croak("Usage: POSIX::mbstowcs(s, pwcs, n)");
  4009.     }
  4010.     {
  4011.     wchar_t *    s = (wchar_t *)SvPV(ST(0),na);
  4012.     char *    pwcs = (char *)SvPV(ST(1),na);
  4013.     size_t    n = (size_t)SvIV(ST(2));
  4014.     size_t    RETVAL;
  4015.  
  4016.     RETVAL = mbstowcs(s, pwcs, n);
  4017.     ST(0) = sv_newmortal();
  4018.     sv_setiv(ST(0), (IV)RETVAL);
  4019.     }
  4020.     XSRETURN(1);
  4021. }
  4022.  
  4023. XS(XS_POSIX_mbtowc)
  4024. {
  4025.     dXSARGS;
  4026.     if (items != 3) {
  4027.     croak("Usage: POSIX::mbtowc(pwc, s, n)");
  4028.     }
  4029.     {
  4030.     wchar_t *    pwc = (wchar_t *)SvPV(ST(0),na);
  4031.     char *    s = (char *)SvPV(ST(1),na);
  4032.     size_t    n = (size_t)SvIV(ST(2));
  4033.     int    RETVAL;
  4034.  
  4035.     RETVAL = mbtowc(pwc, s, n);
  4036.     ST(0) = sv_newmortal();
  4037.     sv_setiv(ST(0), (IV)RETVAL);
  4038.     }
  4039.     XSRETURN(1);
  4040. }
  4041.  
  4042. XS(XS_POSIX_wcstombs)
  4043. {
  4044.     dXSARGS;
  4045.     if (items != 3) {
  4046.     croak("Usage: POSIX::wcstombs(s, pwcs, n)");
  4047.     }
  4048.     {
  4049.     char *    s = (char *)SvPV(ST(0),na);
  4050.     wchar_t *    pwcs = (wchar_t *)SvPV(ST(1),na);
  4051.     size_t    n = (size_t)SvIV(ST(2));
  4052.     int    RETVAL;
  4053.  
  4054.     RETVAL = wcstombs(s, pwcs, n);
  4055.     ST(0) = sv_newmortal();
  4056.     sv_setiv(ST(0), (IV)RETVAL);
  4057.     }
  4058.     XSRETURN(1);
  4059. }
  4060.  
  4061. XS(XS_POSIX_wctomb)
  4062. {
  4063.     dXSARGS;
  4064.     if (items != 2) {
  4065.     croak("Usage: POSIX::wctomb(s, wchar)");
  4066.     }
  4067.     {
  4068.     char *    s = (char *)SvPV(ST(0),na);
  4069.     wchar_t    wchar = (wchar_t)SvIV(ST(1));
  4070.     int    RETVAL;
  4071.  
  4072.     RETVAL = wctomb(s, wchar);
  4073.     ST(0) = sv_newmortal();
  4074.     sv_setiv(ST(0), (IV)RETVAL);
  4075.     }
  4076.     XSRETURN(1);
  4077. }
  4078.  
  4079. XS(XS_POSIX_strcoll)
  4080. {
  4081.     dXSARGS;
  4082.     if (items != 2) {
  4083.     croak("Usage: POSIX::strcoll(s1, s2)");
  4084.     }
  4085.     {
  4086.     char *    s1 = (char *)SvPV(ST(0),na);
  4087.     char *    s2 = (char *)SvPV(ST(1),na);
  4088.     int    RETVAL;
  4089.  
  4090.     RETVAL = strcoll(s1, s2);
  4091.     ST(0) = sv_newmortal();
  4092.     sv_setiv(ST(0), (IV)RETVAL);
  4093.     }
  4094.     XSRETURN(1);
  4095. }
  4096.  
  4097. XS(XS_POSIX_strxfrm)
  4098. {
  4099.     dXSARGS;
  4100.     if (items != 1) {
  4101.     croak("Usage: POSIX::strxfrm(src)");
  4102.     }
  4103.     {
  4104.     SV *    src = ST(0);
  4105.     SV *    RETVAL;
  4106.     {
  4107.           STRLEN srclen;
  4108.           STRLEN dstlen;
  4109.           char *p = SvPV(src,srclen);
  4110.           srclen++;
  4111.           ST(0) = sv_2mortal(newSV(srclen));
  4112.           dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)srclen);
  4113.           if (dstlen > srclen) {
  4114.               dstlen++;
  4115.               SvGROW(ST(0), dstlen);
  4116.               strxfrm(SvPVX(ST(0)), p, (size_t)dstlen);
  4117.               dstlen--;
  4118.           }
  4119.           SvCUR(ST(0)) = dstlen;
  4120.         SvPOK_only(ST(0));
  4121.     }
  4122.     }
  4123.     XSRETURN(1);
  4124. }
  4125.  
  4126. XS(XS_POSIX_mkfifo)
  4127. {
  4128.     dXSARGS;
  4129.     if (items != 2) {
  4130.     croak("Usage: POSIX::mkfifo(filename, mode)");
  4131.     }
  4132.     {
  4133.     char *    filename = (char *)SvPV(ST(0),na);
  4134.     Mode_t    mode = (Mode_t)SvNV(ST(1));
  4135.     SysRet    RETVAL;
  4136.  
  4137.     RETVAL = mkfifo(filename, mode);
  4138.     ST(0) = sv_newmortal();
  4139.     if (RETVAL != -1) {
  4140.         if (RETVAL == 0)
  4141.         sv_setpvn(ST(0), "0 but true", 10);
  4142.         else
  4143.         sv_setiv(ST(0), (IV)RETVAL);
  4144.     }
  4145.     }
  4146.     XSRETURN(1);
  4147. }
  4148.  
  4149. XS(XS_POSIX_tcdrain)
  4150. {
  4151.     dXSARGS;
  4152.     if (items != 1) {
  4153.     croak("Usage: POSIX::tcdrain(fd)");
  4154.     }
  4155.     {
  4156.     int    fd = (int)SvIV(ST(0));
  4157.     SysRet    RETVAL;
  4158.  
  4159.     RETVAL = tcdrain(fd);
  4160.     ST(0) = sv_newmortal();
  4161.     if (RETVAL != -1) {
  4162.         if (RETVAL == 0)
  4163.         sv_setpvn(ST(0), "0 but true", 10);
  4164.         else
  4165.         sv_setiv(ST(0), (IV)RETVAL);
  4166.     }
  4167.     }
  4168.     XSRETURN(1);
  4169. }
  4170.  
  4171. XS(XS_POSIX_tcflow)
  4172. {
  4173.     dXSARGS;
  4174.     if (items != 2) {
  4175.     croak("Usage: POSIX::tcflow(fd, action)");
  4176.     }
  4177.     {
  4178.     int    fd = (int)SvIV(ST(0));
  4179.     int    action = (int)SvIV(ST(1));
  4180.     SysRet    RETVAL;
  4181.  
  4182.     RETVAL = tcflow(fd, action);
  4183.     ST(0) = sv_newmortal();
  4184.     if (RETVAL != -1) {
  4185.         if (RETVAL == 0)
  4186.         sv_setpvn(ST(0), "0 but true", 10);
  4187.         else
  4188.         sv_setiv(ST(0), (IV)RETVAL);
  4189.     }
  4190.     }
  4191.     XSRETURN(1);
  4192. }
  4193.  
  4194. XS(XS_POSIX_tcflush)
  4195. {
  4196.     dXSARGS;
  4197.     if (items != 2) {
  4198.     croak("Usage: POSIX::tcflush(fd, queue_selector)");
  4199.     }
  4200.     {
  4201.     int    fd = (int)SvIV(ST(0));
  4202.     int    queue_selector = (int)SvIV(ST(1));
  4203.     SysRet    RETVAL;
  4204.  
  4205.     RETVAL = tcflush(fd, queue_selector);
  4206.     ST(0) = sv_newmortal();
  4207.     if (RETVAL != -1) {
  4208.         if (RETVAL == 0)
  4209.         sv_setpvn(ST(0), "0 but true", 10);
  4210.         else
  4211.         sv_setiv(ST(0), (IV)RETVAL);
  4212.     }
  4213.     }
  4214.     XSRETURN(1);
  4215. }
  4216.  
  4217. XS(XS_POSIX_tcsendbreak)
  4218. {
  4219.     dXSARGS;
  4220.     if (items != 2) {
  4221.     croak("Usage: POSIX::tcsendbreak(fd, duration)");
  4222.     }
  4223.     {
  4224.     int    fd = (int)SvIV(ST(0));
  4225.     int    duration = (int)SvIV(ST(1));
  4226.     SysRet    RETVAL;
  4227.  
  4228.     RETVAL = tcsendbreak(fd, duration);
  4229.     ST(0) = sv_newmortal();
  4230.     if (RETVAL != -1) {
  4231.         if (RETVAL == 0)
  4232.         sv_setpvn(ST(0), "0 but true", 10);
  4233.         else
  4234.         sv_setiv(ST(0), (IV)RETVAL);
  4235.     }
  4236.     }
  4237.     XSRETURN(1);
  4238. }
  4239.  
  4240. XS(XS_POSIX_asctime)
  4241. {
  4242.     dXSARGS;
  4243.     if (items < 6 || items > 9) {
  4244.     croak("Usage: POSIX::asctime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)");
  4245.     }
  4246.     {
  4247.     int    sec = (int)SvIV(ST(0));
  4248.     int    min = (int)SvIV(ST(1));
  4249.     int    hour = (int)SvIV(ST(2));
  4250.     int    mday = (int)SvIV(ST(3));
  4251.     int    mon = (int)SvIV(ST(4));
  4252.     int    year = (int)SvIV(ST(5));
  4253.     int    wday;
  4254.     int    yday;
  4255.     int    isdst;
  4256.     char *    RETVAL;
  4257.  
  4258.     if (items < 7)
  4259.         wday = 0;
  4260.     else {
  4261.         wday = (int)SvIV(ST(6));
  4262.     }
  4263.  
  4264.     if (items < 8)
  4265.         yday = 0;
  4266.     else {
  4267.         yday = (int)SvIV(ST(7));
  4268.     }
  4269.  
  4270.     if (items < 9)
  4271.         isdst = 0;
  4272.     else {
  4273.         isdst = (int)SvIV(ST(8));
  4274.     }
  4275.     {
  4276.         struct tm mytm;
  4277.         mytm.tm_sec = sec;
  4278.         mytm.tm_min = min;
  4279.         mytm.tm_hour = hour;
  4280.         mytm.tm_mday = mday;
  4281.         mytm.tm_mon = mon;
  4282.         mytm.tm_year = year;
  4283.         mytm.tm_wday = wday;
  4284.         mytm.tm_yday = yday;
  4285.         mytm.tm_isdst = isdst;
  4286.         RETVAL = asctime(&mytm);
  4287.     }
  4288.     ST(0) = sv_newmortal();
  4289.     sv_setpv((SV*)ST(0), RETVAL);
  4290.     }
  4291.     XSRETURN(1);
  4292. }
  4293.  
  4294. XS(XS_POSIX_clock)
  4295. {
  4296.     dXSARGS;
  4297.     if (items != 0) {
  4298.     croak("Usage: POSIX::clock()");
  4299.     }
  4300.     {
  4301.     long    RETVAL;
  4302.  
  4303.     RETVAL = clock();
  4304.     ST(0) = sv_newmortal();
  4305.     sv_setiv(ST(0), (IV)RETVAL);
  4306.     }
  4307.     XSRETURN(1);
  4308. }
  4309.  
  4310. XS(XS_POSIX_ctime)
  4311. {
  4312.     dXSARGS;
  4313.     if (items != 1) {
  4314.     croak("Usage: POSIX::ctime(time)");
  4315.     }
  4316.     {
  4317.     Time_t *    time = (Time_t *)SvPV(ST(0),na);
  4318.     char *    RETVAL;
  4319.  
  4320.     RETVAL = ctime(time);
  4321.     ST(0) = sv_newmortal();
  4322.     sv_setpv((SV*)ST(0), RETVAL);
  4323.     }
  4324.     XSRETURN(1);
  4325. }
  4326.  
  4327. XS(XS_POSIX_difftime)
  4328. {
  4329.     dXSARGS;
  4330.     if (items != 2) {
  4331.     croak("Usage: POSIX::difftime(time1, time2)");
  4332.     }
  4333.     {
  4334.     Time_t    time1 = (Time_t)SvNV(ST(0));
  4335.     Time_t    time2 = (Time_t)SvNV(ST(1));
  4336.     double    RETVAL;
  4337.  
  4338.     RETVAL = difftime(time1, time2);
  4339.     ST(0) = sv_newmortal();
  4340.     sv_setnv(ST(0), (double)RETVAL);
  4341.     }
  4342.     XSRETURN(1);
  4343. }
  4344.  
  4345. XS(XS_POSIX_mktime)
  4346. {
  4347.     dXSARGS;
  4348.     if (items < 6 || items > 9) {
  4349.     croak("Usage: POSIX::mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)");
  4350.     }
  4351.     {
  4352.     int    sec = (int)SvIV(ST(0));
  4353.     int    min = (int)SvIV(ST(1));
  4354.     int    hour = (int)SvIV(ST(2));
  4355.     int    mday = (int)SvIV(ST(3));
  4356.     int    mon = (int)SvIV(ST(4));
  4357.     int    year = (int)SvIV(ST(5));
  4358.     int    wday;
  4359.     int    yday;
  4360.     int    isdst;
  4361.     SysRetLong    RETVAL;
  4362.  
  4363.     if (items < 7)
  4364.         wday = 0;
  4365.     else {
  4366.         wday = (int)SvIV(ST(6));
  4367.     }
  4368.  
  4369.     if (items < 8)
  4370.         yday = 0;
  4371.     else {
  4372.         yday = (int)SvIV(ST(7));
  4373.     }
  4374.  
  4375.     if (items < 9)
  4376.         isdst = 0;
  4377.     else {
  4378.         isdst = (int)SvIV(ST(8));
  4379.     }
  4380.     {
  4381.         struct tm mytm;
  4382.         mytm.tm_sec = sec;
  4383.         mytm.tm_min = min;
  4384.         mytm.tm_hour = hour;
  4385.         mytm.tm_mday = mday;
  4386.         mytm.tm_mon = mon;
  4387.         mytm.tm_year = year;
  4388.         mytm.tm_wday = wday;
  4389.         mytm.tm_yday = yday;
  4390.         mytm.tm_isdst = isdst;
  4391.         RETVAL = mktime(&mytm);
  4392.     }
  4393.     ST(0) = sv_newmortal();
  4394.     if (RETVAL != -1) {
  4395.         if (RETVAL == 0)
  4396.         sv_setpvn(ST(0), "0 but true", 10);
  4397.         else
  4398.         sv_setiv(ST(0), (IV)RETVAL);
  4399.     }
  4400.     }
  4401.     XSRETURN(1);
  4402. }
  4403.  
  4404. XS(XS_POSIX_strftime)
  4405. {
  4406.     dXSARGS;
  4407.     if (items < 7 || items > 10) {
  4408.     croak("Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)");
  4409.     }
  4410.     {
  4411.     char *    fmt = (char *)SvPV(ST(0),na);
  4412.     int    sec = (int)SvIV(ST(1));
  4413.     int    min = (int)SvIV(ST(2));
  4414.     int    hour = (int)SvIV(ST(3));
  4415.     int    mday = (int)SvIV(ST(4));
  4416.     int    mon = (int)SvIV(ST(5));
  4417.     int    year = (int)SvIV(ST(6));
  4418.     int    wday;
  4419.     int    yday;
  4420.     int    isdst;
  4421.     char *    RETVAL;
  4422.  
  4423.     if (items < 8)
  4424.         wday = 0;
  4425.     else {
  4426.         wday = (int)SvIV(ST(7));
  4427.     }
  4428.  
  4429.     if (items < 9)
  4430.         yday = 0;
  4431.     else {
  4432.         yday = (int)SvIV(ST(8));
  4433.     }
  4434.  
  4435.     if (items < 10)
  4436.         isdst = 0;
  4437.     else {
  4438.         isdst = (int)SvIV(ST(9));
  4439.     }
  4440.     {
  4441.         char tmpbuf[128];
  4442.         struct tm mytm;
  4443.         int len;
  4444.         mytm.tm_sec = sec;
  4445.         mytm.tm_min = min;
  4446.         mytm.tm_hour = hour;
  4447.         mytm.tm_mday = mday;
  4448.         mytm.tm_mon = mon;
  4449.         mytm.tm_year = year;
  4450.         mytm.tm_wday = wday;
  4451.         mytm.tm_yday = yday;
  4452.         mytm.tm_isdst = isdst;
  4453.         len = strftime(tmpbuf, sizeof tmpbuf, fmt, &mytm);
  4454.         ST(0) = sv_2mortal(newSVpv(tmpbuf, len));
  4455.     }
  4456.     }
  4457.     XSRETURN(1);
  4458. }
  4459.  
  4460. XS(XS_POSIX_tzset)
  4461. {
  4462.     dXSARGS;
  4463.     if (items != 0) {
  4464.     croak("Usage: POSIX::tzset()");
  4465.     }
  4466.     {
  4467.  
  4468.     tzset();
  4469.     }
  4470.     XSRETURN(1);
  4471. }
  4472.  
  4473. XS(XS_POSIX_tzname)
  4474. {
  4475.     dXSARGS;
  4476.     if (items != 0) {
  4477.     croak("Usage: POSIX::tzname()");
  4478.     }
  4479.     SP -= items;
  4480.     {
  4481.     EXTEND(sp,2);
  4482.     PUSHs(sv_2mortal(newSVpv(tzname[0],strlen(tzname[0]))));
  4483.     PUSHs(sv_2mortal(newSVpv(tzname[1],strlen(tzname[1]))));
  4484.     PUTBACK;
  4485.     return;
  4486.     }
  4487. }
  4488.  
  4489. XS(XS_POSIX_access)
  4490. {
  4491.     dXSARGS;
  4492.     if (items != 2) {
  4493.     croak("Usage: POSIX::access(filename, mode)");
  4494.     }
  4495.     {
  4496.     char *    filename = (char *)SvPV(ST(0),na);
  4497.     Mode_t    mode = (Mode_t)SvNV(ST(1));
  4498.     SysRet    RETVAL;
  4499.  
  4500.     RETVAL = access(filename, mode);
  4501.     ST(0) = sv_newmortal();
  4502.     if (RETVAL != -1) {
  4503.         if (RETVAL == 0)
  4504.         sv_setpvn(ST(0), "0 but true", 10);
  4505.         else
  4506.         sv_setiv(ST(0), (IV)RETVAL);
  4507.     }
  4508.     }
  4509.     XSRETURN(1);
  4510. }
  4511.  
  4512. XS(XS_POSIX_ctermid)
  4513. {
  4514.     dXSARGS;
  4515.     if (items < 0 || items > 1) {
  4516.     croak("Usage: POSIX::ctermid(s = 0)");
  4517.     }
  4518.     {
  4519.     char * s = 0;
  4520.     char *    RETVAL;
  4521.  
  4522.     RETVAL = ctermid(s);
  4523.     ST(0) = sv_newmortal();
  4524.     sv_setpv((SV*)ST(0), RETVAL);
  4525.     }
  4526.     XSRETURN(1);
  4527. }
  4528.  
  4529. XS(XS_POSIX_cuserid)
  4530. {
  4531.     dXSARGS;
  4532.     if (items < 0 || items > 1) {
  4533.     croak("Usage: POSIX::cuserid(s = 0)");
  4534.     }
  4535.     {
  4536.     char * s = 0;
  4537.     char *    RETVAL;
  4538.  
  4539.     RETVAL = cuserid(s);
  4540.     ST(0) = sv_newmortal();
  4541.     sv_setpv((SV*)ST(0), RETVAL);
  4542.     }
  4543.     XSRETURN(1);
  4544. }
  4545.  
  4546. XS(XS_POSIX_fpathconf)
  4547. {
  4548.     dXSARGS;
  4549.     if (items != 2) {
  4550.     croak("Usage: POSIX::fpathconf(fd, name)");
  4551.     }
  4552.     {
  4553.     int    fd = (int)SvIV(ST(0));
  4554.     int    name = (int)SvIV(ST(1));
  4555.     SysRetLong    RETVAL;
  4556.  
  4557.     RETVAL = fpathconf(fd, name);
  4558.     ST(0) = sv_newmortal();
  4559.     if (RETVAL != -1) {
  4560.         if (RETVAL == 0)
  4561.         sv_setpvn(ST(0), "0 but true", 10);
  4562.         else
  4563.         sv_setiv(ST(0), (IV)RETVAL);
  4564.     }
  4565.     }
  4566.     XSRETURN(1);
  4567. }
  4568.  
  4569. XS(XS_POSIX_pathconf)
  4570. {
  4571.     dXSARGS;
  4572.     if (items != 2) {
  4573.     croak("Usage: POSIX::pathconf(filename, name)");
  4574.     }
  4575.     {
  4576.     char *    filename = (char *)SvPV(ST(0),na);
  4577.     int    name = (int)SvIV(ST(1));
  4578.     SysRetLong    RETVAL;
  4579.  
  4580.     RETVAL = pathconf(filename, name);
  4581.     ST(0) = sv_newmortal();
  4582.     if (RETVAL != -1) {
  4583.         if (RETVAL == 0)
  4584.         sv_setpvn(ST(0), "0 but true", 10);
  4585.         else
  4586.         sv_setiv(ST(0), (IV)RETVAL);
  4587.     }
  4588.     }
  4589.     XSRETURN(1);
  4590. }
  4591.  
  4592. XS(XS_POSIX_pause)
  4593. {
  4594.     dXSARGS;
  4595.     if (items != 0) {
  4596.     croak("Usage: POSIX::pause()");
  4597.     }
  4598.     {
  4599.     SysRet    RETVAL;
  4600.  
  4601.     RETVAL = pause();
  4602.     ST(0) = sv_newmortal();
  4603.     if (RETVAL != -1) {
  4604.         if (RETVAL == 0)
  4605.         sv_setpvn(ST(0), "0 but true", 10);
  4606.         else
  4607.         sv_setiv(ST(0), (IV)RETVAL);
  4608.     }
  4609.     }
  4610.     XSRETURN(1);
  4611. }
  4612.  
  4613. XS(XS_POSIX_sysconf)
  4614. {
  4615.     dXSARGS;
  4616.     if (items != 1) {
  4617.     croak("Usage: POSIX::sysconf(name)");
  4618.     }
  4619.     {
  4620.     int    name = (int)SvIV(ST(0));
  4621.     SysRetLong    RETVAL;
  4622.  
  4623.     RETVAL = sysconf(name);
  4624.     ST(0) = sv_newmortal();
  4625.     if (RETVAL != -1) {
  4626.         if (RETVAL == 0)
  4627.         sv_setpvn(ST(0), "0 but true", 10);
  4628.         else
  4629.         sv_setiv(ST(0), (IV)RETVAL);
  4630.     }
  4631.     }
  4632.     XSRETURN(1);
  4633. }
  4634.  
  4635. XS(XS_POSIX_ttyname)
  4636. {
  4637.     dXSARGS;
  4638.     if (items != 1) {
  4639.     croak("Usage: POSIX::ttyname(fd)");
  4640.     }
  4641.     {
  4642.     int    fd = (int)SvIV(ST(0));
  4643.     char *    RETVAL;
  4644.  
  4645.     RETVAL = ttyname(fd);
  4646.     ST(0) = sv_newmortal();
  4647.     sv_setpv((SV*)ST(0), RETVAL);
  4648.     }
  4649.     XSRETURN(1);
  4650. }
  4651.  
  4652. XS(boot_POSIX)
  4653. {
  4654.     dXSARGS;
  4655.     char* file = __FILE__;
  4656.  
  4657.     newXS("POSIX::SigSet::new", XS_POSIX__SigSet_new, file);
  4658.     newXS("POSIX::SigSet::DESTROY", XS_POSIX__SigSet_DESTROY, file);
  4659.     newXS("POSIX::SigSet::addset", XS_POSIX__SigSet_sigaddset, file);
  4660.     newXS("POSIX::SigSet::delset", XS_POSIX__SigSet_sigdelset, file);
  4661.     newXS("POSIX::SigSet::emptyset", XS_POSIX__SigSet_sigemptyset, file);
  4662.     newXS("POSIX::SigSet::fillset", XS_POSIX__SigSet_sigfillset, file);
  4663.     newXS("POSIX::SigSet::ismember", XS_POSIX__SigSet_sigismember, file);
  4664.     newXS("POSIX::Termios::new", XS_POSIX__Termios_new, file);
  4665.     newXS("POSIX::Termios::DESTROY", XS_POSIX__Termios_DESTROY, file);
  4666.     newXS("POSIX::Termios::getattr", XS_POSIX__Termios_getattr, file);
  4667.     newXS("POSIX::Termios::setattr", XS_POSIX__Termios_setattr, file);
  4668.     newXS("POSIX::Termios::getispeed", XS_POSIX__Termios_cfgetispeed, file);
  4669.     newXS("POSIX::Termios::getospeed", XS_POSIX__Termios_cfgetospeed, file);
  4670.     newXS("POSIX::Termios::getiflag", XS_POSIX__Termios_getiflag, file);
  4671.     newXS("POSIX::Termios::getoflag", XS_POSIX__Termios_getoflag, file);
  4672.     newXS("POSIX::Termios::getcflag", XS_POSIX__Termios_getcflag, file);
  4673.     newXS("POSIX::Termios::getlflag", XS_POSIX__Termios_getlflag, file);
  4674.     newXS("POSIX::Termios::getcc", XS_POSIX__Termios_getcc, file);
  4675.     newXS("POSIX::Termios::setispeed", XS_POSIX__Termios_cfsetispeed, file);
  4676.     newXS("POSIX::Termios::setospeed", XS_POSIX__Termios_cfsetospeed, file);
  4677.     newXS("POSIX::Termios::setiflag", XS_POSIX__Termios_setiflag, file);
  4678.     newXS("POSIX::Termios::setoflag", XS_POSIX__Termios_setoflag, file);
  4679.     newXS("POSIX::Termios::setcflag", XS_POSIX__Termios_setcflag, file);
  4680.     newXS("POSIX::Termios::setlflag", XS_POSIX__Termios_setlflag, file);
  4681.     newXS("POSIX::Termios::setcc", XS_POSIX__Termios_setcc, file);
  4682.     newXS("FileHandle::getpos", XS_FileHandle_fgetpos, file);
  4683.     newXS("FileHandle::setpos", XS_FileHandle_fsetpos, file);
  4684.     newXS("FileHandle::ungetc", XS_FileHandle_ungetc, file);
  4685.     newXS("FileHandle::new_tmpfile", XS_FileHandle_new_tmpfile, file);
  4686.     newXS("FileHandle::error", XS_FileHandle_ferror, file);
  4687.     newXS("FileHandle::flush", XS_FileHandle_fflush, file);
  4688.     newXS("FileHandle::setbuf", XS_FileHandle_setbuf, file);
  4689.     newXS("FileHandle::setvbuf", XS_FileHandle_setvbuf, file);
  4690.     newXS("POSIX::constant", XS_POSIX_constant, file);
  4691.     newXS("POSIX::isalnum", XS_POSIX_isalnum, file);
  4692.     newXS("POSIX::isalpha", XS_POSIX_isalpha, file);
  4693.     newXS("POSIX::iscntrl", XS_POSIX_iscntrl, file);
  4694.     newXS("POSIX::isdigit", XS_POSIX_isdigit, file);
  4695.     newXS("POSIX::isgraph", XS_POSIX_isgraph, file);
  4696.     newXS("POSIX::islower", XS_POSIX_islower, file);
  4697.     newXS("POSIX::isprint", XS_POSIX_isprint, file);
  4698.     newXS("POSIX::ispunct", XS_POSIX_ispunct, file);
  4699.     newXS("POSIX::isspace", XS_POSIX_isspace, file);
  4700.     newXS("POSIX::isupper", XS_POSIX_isupper, file);
  4701.     newXS("POSIX::isxdigit", XS_POSIX_isxdigit, file);
  4702.     newXS("POSIX::open", XS_POSIX_open, file);
  4703.     newXS("POSIX::localeconv", XS_POSIX_localeconv, file);
  4704.     newXS("POSIX::setlocale", XS_POSIX_setlocale, file);
  4705.     newXS("POSIX::acos", XS_POSIX_acos, file);
  4706.     newXS("POSIX::asin", XS_POSIX_asin, file);
  4707.     newXS("POSIX::atan", XS_POSIX_atan, file);
  4708.     newXS("POSIX::ceil", XS_POSIX_ceil, file);
  4709.     newXS("POSIX::cosh", XS_POSIX_cosh, file);
  4710.     newXS("POSIX::floor", XS_POSIX_floor, file);
  4711.     newXS("POSIX::fmod", XS_POSIX_fmod, file);
  4712.     newXS("POSIX::frexp", XS_POSIX_frexp, file);
  4713.     newXS("POSIX::ldexp", XS_POSIX_ldexp, file);
  4714.     newXS("POSIX::log10", XS_POSIX_log10, file);
  4715.     newXS("POSIX::modf", XS_POSIX_modf, file);
  4716.     newXS("POSIX::sinh", XS_POSIX_sinh, file);
  4717.     newXS("POSIX::tanh", XS_POSIX_tanh, file);
  4718.     newXS("POSIX::close", XS_POSIX_close, file);
  4719.     newXS("POSIX::dup", XS_POSIX_dup, file);
  4720.     newXS("POSIX::dup2", XS_POSIX_dup2, file);
  4721.     newXS("POSIX::lseek", XS_POSIX_lseek, file);
  4722.     newXS("POSIX::nice", XS_POSIX_nice, file);
  4723.     newXS("POSIX::pipe", XS_POSIX_pipe, file);
  4724.     newXS("POSIX::read", XS_POSIX_read, file);
  4725.     newXS("POSIX::setgid", XS_POSIX_setgid, file);
  4726.     newXS("POSIX::setpgid", XS_POSIX_setpgid, file);
  4727.     newXS("POSIX::setsid", XS_POSIX_setsid, file);
  4728.     newXS("POSIX::setuid", XS_POSIX_setuid, file);
  4729.     newXS("POSIX::tcgetpgrp", XS_POSIX_tcgetpgrp, file);
  4730.     newXS("POSIX::tcsetpgrp", XS_POSIX_tcsetpgrp, file);
  4731.     newXS("POSIX::uname", XS_POSIX_uname, file);
  4732.     newXS("POSIX::write", XS_POSIX_write, file);
  4733.     newXS("POSIX::tmpnam", XS_POSIX_tmpnam, file);
  4734.     newXS("POSIX::abort", XS_POSIX_abort, file);
  4735.     newXS("POSIX::mblen", XS_POSIX_mblen, file);
  4736.     newXS("POSIX::mbstowcs", XS_POSIX_mbstowcs, file);
  4737.     newXS("POSIX::mbtowc", XS_POSIX_mbtowc, file);
  4738.     newXS("POSIX::wcstombs", XS_POSIX_wcstombs, file);
  4739.     newXS("POSIX::wctomb", XS_POSIX_wctomb, file);
  4740.     newXS("POSIX::strcoll", XS_POSIX_strcoll, file);
  4741.     newXS("POSIX::strxfrm", XS_POSIX_strxfrm, file);
  4742.     newXS("POSIX::mkfifo", XS_POSIX_mkfifo, file);
  4743.     newXS("POSIX::tcdrain", XS_POSIX_tcdrain, file);
  4744.     newXS("POSIX::tcflow", XS_POSIX_tcflow, file);
  4745.     newXS("POSIX::tcflush", XS_POSIX_tcflush, file);
  4746.     newXS("POSIX::tcsendbreak", XS_POSIX_tcsendbreak, file);
  4747.     newXS("POSIX::asctime", XS_POSIX_asctime, file);
  4748.     newXS("POSIX::clock", XS_POSIX_clock, file);
  4749.     newXS("POSIX::ctime", XS_POSIX_ctime, file);
  4750.     newXS("POSIX::difftime", XS_POSIX_difftime, file);
  4751.     newXS("POSIX::mktime", XS_POSIX_mktime, file);
  4752.     newXS("POSIX::strftime", XS_POSIX_strftime, file);
  4753.     newXS("POSIX::tzset", XS_POSIX_tzset, file);
  4754.     newXS("POSIX::tzname", XS_POSIX_tzname, file);
  4755.     newXS("POSIX::access", XS_POSIX_access, file);
  4756.     newXS("POSIX::ctermid", XS_POSIX_ctermid, file);
  4757.     newXS("POSIX::cuserid", XS_POSIX_cuserid, file);
  4758.     newXS("POSIX::fpathconf", XS_POSIX_fpathconf, file);
  4759.     newXS("POSIX::pathconf", XS_POSIX_pathconf, file);
  4760.     newXS("POSIX::pause", XS_POSIX_pause, file);
  4761.     newXS("POSIX::sysconf", XS_POSIX_sysconf, file);
  4762.     newXS("POSIX::ttyname", XS_POSIX_ttyname, file);
  4763.     ST(0) = &sv_yes;
  4764.     XSRETURN(1);
  4765. }
  4766.